{ "cells": [ { "cell_type": "markdown", "id": "6d6e66b9-2dcc-4f1d-97ab-0393dbb18afe", "metadata": { "editable": true, "slideshow": { "slide_type": "" }, "tags": [] }, "source": [ "## 2 - The General Linear Model\n", "### Getting to grips with linear models in Python" ] }, { "cell_type": "markdown", "id": "5981ad66-0254-4287-ae75-a4665c3102de", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "This week we will focus on three things:\n", "- How to do basic, psychology-standard analyses in Python using the `pingouin` package\n", "- How to implement a general linear model in Python with `statsmodels`\n", "- and understanding the connection between the two with some examples.\n", "\n", "Don't worry if this confusing. It takes many repetitions and practice to get it to stick!" ] }, { "cell_type": "markdown", "id": "6ef352ef-4faa-4eb2-8a0a-e238affe6c4f", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "### Part 1 - The `pingouin` package for basic statistics\n", "You will be familiar with basic statistics in psychology at this point, and it is very useful to know how to do them in Python. The `pingouin` package covers most of these, and it works seamlessly with `pandas`. As before we need to import it, so we will call our needed packages here." ] }, { "cell_type": "code", "execution_count": 1, "id": "0cb0f8ca-83c4-4e98-9c52-fdd8d604ba5e", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [], "source": [ "# Import what we need\n", "import pandas as pd # dataframes\n", "import seaborn as sns # plots\n", "import pingouin as pg # stats, note the traditional alias\n", "\n", "# Set the style for plots\n", "sns.set_style('dark') # a different theme!\n", "sns.set_context('talk')" ] }, { "cell_type": "markdown", "id": "cb640d9f-eaa2-4fc8-814a-5752b41c20c2", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "Lets see how this package allows us to do some basic psychology-style analyses, with some example datasets that we can load from `seaborn`." ] }, { "cell_type": "markdown", "id": "5a609664-abf1-4cd9-adee-8f277ea067e7", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "#### The **independent** samples t-test\n", "This t-test is often the first analysis we learn. With `pingouin`, it is handled by the `pg.ttest` function. Lets load up the `tips` dataset and do a t-test.\n", "\n", "**Test**: Do smokers tip more than non-smokers? To test this we need to give the function just the values for each group, which we get by filtering our data." ] }, { "cell_type": "code", "execution_count": 2, "id": "68d19d7c-3275-4f0f-b302-5216264343ea", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
total_billtipsexsmokerdaytimesize
016.991.01FemaleNoSunDinner2
110.341.66MaleNoSunDinner3
\n", "
" ], "text/plain": [ " total_bill tip sex smoker day time size\n", "0 16.99 1.01 Female No Sun Dinner 2\n", "1 10.34 1.66 Male No Sun Dinner 3" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# First load the data\n", "tips = sns.load_dataset('tips')\n", "display(tips.head(2))" ] }, { "cell_type": "code", "execution_count": 3, "id": "3e4e7b04-d4c0-45af-bb0d-97f3ea38a5a1", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Tdofalternativep-valCI95%cohen-dBF10power
T-test0.0918192.2634two-sided0.9269[-0.35, 0.38]0.01220.1450.051
\n", "
" ], "text/plain": [ " T dof alternative p-val CI95% cohen-d BF10 \\\n", "T-test 0.0918 192.2634 two-sided 0.9269 [-0.35, 0.38] 0.0122 0.145 \n", "\n", " power \n", "T-test 0.051 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# First filter the data by smokers and nonsmokers, and select the tip column\n", "smokers = tips.query('smoker == \"Yes\"')['tip']\n", "nonsmokers = tips.query('smoker == \"No\"')['tip']\n", "\n", "# Pass to the t-test function\n", "pg.ttest(smokers, nonsmokers).round(4)" ] }, { "cell_type": "markdown", "id": "19c89a5f-e5b8-4c0f-82bd-764a3df6cf23", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "#### The **paired** samples t-test \n", "Comparing the means of two variables is achieved with the same function, but telling it that the two variables are paired. Lets compare the mean bill price with the mean tip price - meals should be on average more expensive than their tips!" ] }, { "cell_type": "code", "execution_count": 4, "id": "54d2e488-0eb5-4d64-baa6-ed0671eac15a", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Tdofalternativep-valCI95%cohen-dBF10power
T-test32.6465243two-sided0.0[15.77, 17.8]2.63521.222e+871.0
\n", "
" ], "text/plain": [ " T dof alternative p-val CI95% cohen-d BF10 \\\n", "T-test 32.6465 243 two-sided 0.0 [15.77, 17.8] 2.6352 1.222e+87 \n", "\n", " power \n", "T-test 1.0 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Select the columns\n", "bills = tips['total_bill']\n", "tipamount = tips['tip']\n", "\n", "# Do the test\n", "pg.ttest(bills, tipamount, paired=True).round(4)" ] }, { "cell_type": "markdown", "id": "cc893df3-f81d-46ef-9b37-02a8fd994f2b", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "One-sample tests are also easily achieved by stating the target value as the second input. For example, to compare the mean tip amount to $1, we do `pg.ttest(tipamount, 1)`." ] }, { "cell_type": "markdown", "id": "ccd03bd9-0aeb-4267-8e4c-9115f46947bc", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "#### Correlation\n", "This useful statistic is a special case of the general linear model as we will see, but it is computed easily enough with `pg.corr`.\n", "\n", "Let us correlate the tip amount and total bill amount:" ] }, { "cell_type": "code", "execution_count": 5, "id": "cd2328d7-842d-41a0-99cf-e32aabedb4dd", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nrCI95%p-valBF10power
pearson2440.675734[0.6, 0.74]6.692471e-344.952e+301.0
\n", "
" ], "text/plain": [ " n r CI95% p-val BF10 power\n", "pearson 244 0.675734 [0.6, 0.74] 6.692471e-34 4.952e+30 1.0" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Correlation\n", "pg.corr(tips['total_bill'], tips['tip'])" ] }, { "cell_type": "markdown", "id": "42e2df7f-0249-4018-9902-1323c9bf1035", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "#### ANOVA\n", "The analysis of variance (more about the difference in means, actually) comes in many forms - one way, two way, mixed, repeated, analysis of covariance, and so on. We need not dwell on these confusing definitions, but it is good to demonstrate how they are handled." ] }, { "cell_type": "markdown", "id": "fb990371-444f-4a65-b780-82e5ae923c5b", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "#### One-way ANOVA\n", "Designed for testing mean differences in a continuous outcome under two or more groups, in the `pg.anova` function. Let's examine whether the amount of tips vary over different days - the `tips` dataset has Thursday-Sunday as days. A plot will help us." ] }, { "cell_type": "code", "execution_count": 6, "id": "174a7301-ab45-4925-bb81-196593993c59", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot tips\n", "sns.barplot(data=tips, x='day', y='tip');" ] }, { "cell_type": "code", "execution_count": 7, "id": "c762ea9c-27ec-4d87-9646-413fa37b8cc1", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sourceddof1ddof2Fp-uncnp2
0day32401.6723550.1735890.020476
\n", "
" ], "text/plain": [ " Source ddof1 ddof2 F p-unc np2\n", "0 day 3 240 1.672355 0.173589 0.020476" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# A one-way ANOVA tests for differences amongst those means\n", "# Notice we pass tips to the 'data' argument. \n", "# Notice 'between' refers to the between subjects measure \n", "# we can add more variables to 'between'\n", "pg.anova(data=tips, dv='tip', between=['day'])" ] }, { "cell_type": "markdown", "id": "1bc38d71-8273-40d4-aace-94dfe6f87eb8", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Extending this to a 'two-way' ANOVA is easy - tip differences among days and men and women?" ] }, { "cell_type": "code", "execution_count": 8, "id": "f9d8d188-4d80-4d73-8c06-e0c0ccbed936", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj4AAAHHCAYAAAC/R1LgAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA8nklEQVR4nO3deVwV9f7H8fc57KAIuOSau7gvuWep19LKskxvudWv0m6auVSa2W7e0jLLUtssu6mpuaDlUqmYmajJVVETRXBBwRVxQQRkm98f5rkSiwoHzjnO6/l49IhZzvf7GQfh7Xe+M2MxDMMQAACACVgdXQAAAEBJIfgAAADTIPgAAADTIPgAAADTIPgAAADTIPgAAADTIPgAAADTIPgAAADTIPgAAADTcHd0AYU1YsQIrVq1ShMnTlSvXr3s3r5hGMrMzLZ7uwAAwP7c3a2yWCzX3q8EarG7RYsWadWqVcXaR2Zmts6dSynWPgAAgH0EBPjKw8Ptmvu53KWuQ4cOacKECY4uAwAAuCCXCj7p6ekaNWqUrFarGjZs6OhyAACAi3Gp4DNlyhRFRkbqzTffVKVKlRxdDgAAcDEuE3w2bdqk//znP7r//vv10EMPObocAADgglwi+Jw5c0ZjxoxRxYoVNW7cOEeXAwAAXJRL3NX12muvKTExUd9++638/f0dXQ4AAHBRTj/iM3fuXP36668aNGiQ2rZt6+hyAACAC3Pq4BMTE6NJkyapUaNGGjlypKPLAQAALs5iGIbh6CLyM3jwYP32229q2bKlKleunGPbf//7X504cUItWrRQ1apV1bp1a/Xp08dufWdkZPEAQwAAXMT1PsDQqef4pKRcDh7btm3Ttm3b8twnIiJCERERcnd3t2vwAQAANx+nHvEpyNChQ7V27dpie1cXIz4AALiOm/aVFQAAAIVF8AEAAKbh1HN8AACA88jMzFRIyALt3x+tOnXqqXfvPnJ3d60o4bJzfIobc3wAAMhpwYK5Wrp0kW354YcfUZ8+AxxY0f8wxwcAANhVRMS2ApddAcEHAABcl/T0SwUuuwKCDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA2CDwAAMA13RxcAAGaVmZmpkJAF2r8/WnXq1FPv3n3k7s6PZaA48TcMABwkJGSBli5dJEn688+dkqQ+fQY4siQUI4Kuc+BSFwA4SETEtgKXcXO5EnT//HOnli5dpJCQBY4uyZQIPgDgIOnplwpcxs2FoOscCD4AAJQAgq5zIPgAAADTIPgAAADTIPgAAADTIPgAAADT4AECTo7nPgAAYD/8BnVyPOAMAAD74VKXk+O5DwAA2A/Bx8nx3AcAAOyH4AMAAEyD4AMAAEyD4AMAAEyD4AMAAEyD4AMAAEyD4AMAAEyD4AMAAEyDJzcDToRXlAAoqvLlSxdb225u1lzLxdlfQsIFu7fJT1TAifCKEgAoXgQfwInk9YoSgg+Awoif3ElGRqpd28xI9JXkdtVyrOImtrFrHxYPH1Udvd6ubV6N4AM4EV5RAsBejIxUuwcfGT5/Wzbs30cxY3IzAAAwDUZ8ANgVE7QBODN+GgGwKyZoA3BmXOoCYFd5TdAGAGdB8AFgV0zQBuDMCD4AAMA0CD4AAMA0CD4AAMA0uKsLAFBoPL4ArobvTgBAofH4Argagg8AoNBupvfLFedbxqWSf7M58sYcHwBAofH4ArgaRnwAALjK3eMWKjU90+7teiYk5RhtOJyQpA6vzrNrH4F+XlrxWm+7tnmzIfgAAHCV1PRMpWXYP/h4GEaOZcMw7N5ParqbXdu7GXGpCwAAmAbBBwAAmAbBBwAAmAbBBwAAmAbBBwAAmAbBBwAAmAbBBwAAmAbBBwAAmAYPMASAfNxs725KSLhQbG0DrsJlgs/PP/+suXPnKjIyUoZhqFq1aurevbueeuopeXt7O7o8AADgAlwi+EybNk3Tp0+Xm5ubWrZsqVKlSmnXrl36+OOPtXLlSs2dO1dlypRxdJkAblKu/O4mH093hY571K5tAq7M6YPP1q1bNX36dPn7+2vOnDmqX7++JCklJUUjRozQhg0b9PHHH+utt95ycKUAblau/O4mADk5/eTmpUuXSpL+9a9/2UKPJPn6+mrEiBGSpN9++80RpQEAABfj9CM+b7/9tgYOHKjy5cvn2paVlSVJcnPjbbQAAODanD74uLu7q3bt2rnWHz9+XO+//74kqVevXiVdFgAAcEFOH3z+7r333tPOnTu1c+dOWSwWDRw4UEOGDHF0WQAAwAW4XPAJCQlRUlKSJMnT01MJCQk6ffq0KlSo4ODKAACAs3O54LNs2TIFBgYqOjpaH374oZYvX66IiAgtX75cvr6+JV4PDzgDAMB1OP1dXX9XqVIleXt7q2nTpvrqq69Ur149xcfHa+HChY4uDQAAODmXG/G5mqenp+677z5FR0drz549Dq2FB5zlLzMzUyEhC7R/f7Tq1Kmn3r37yN3dpb/1AAAuyul/+0ydOlUHDx7U2LFjVbFixVzbPT09JV3+5epIPOAsfyEhC7R06SJJ0p9/7pQk9ekzwJElAQBMyukvdW3cuFE///yzVq5cmef29evXS5KaNGlSkmXhBkREbCtwGQCAkuL0wWfAgMsjA9OnT9euXbts6zMyMjR58mSFh4erbNmy6t27t6NKxDWkp18qcBkAgJLi9Je6HnzwQW3dulULFixQnz591KJFC/n7+2vv3r06ceKEAgIC9Pnnn8vf39/RpQIAACfn9MFHksaPH6927dpp/vz5ioyMVHp6uipXrqwnnnhCgwYN0i233OLoEgEAgAtwieAjSd27d1f37t0dXQYAAHBhTj/HBwCAm4FhdS9wGSWD4AMAQAnILFO1wGVX4OlmFLjsCoibAACUgLRKzSRJbhcTlOVX3rbsSpoFpetIskeOZVdD8AEAoCRYrEqr3MLRVRTJg9UvSpIOJHmotn+GbdmVEHwAAMB1cbdKvWq6Xti5GnN8AACAaRB8AACAaRB8AACAaTDHBwBuYt4ebravy5cvbff23dysuZaLo58rEhIuFFvbMAeCD2BCxfmLiV+EAJwZwQcATCJ+cicZGal2bTMj0VeS21XLsYqb2MaufVg8fFR19Hq7tgnzIvgAJsYvQnMxMlLtfr5l+Pxt2bB/H4AdEXwAE+MXIQCz4a4uAABgGgQfAABgGgQfAABgGgQfAABgGkxuBm5AcT6PRir5Z+AAgNkw4gMAAEyDER+gEO4et1Cp6Zl2b9czISnHv0YOJySpw6vz7NpHoJ+XVrzW265tAoCrIPgAhZCanqm0DPsHHw/DyLFsGIbd+0lNd7v2TgBwk+JSFwAAMA2CDwAAMA2CDwA4iGF1L3AZgP0RfADAQTLLVC1wGYD98c8LAHCQtErNJEluFxOU5Vfetgyg+BB8AMBRLFalVW7h6CoAU+FSFwAAMA1GfCBvj/8916U4Xo9Q0q9hSEi4UGxtAwBcGyM+AADANBjxQQ7xkzvJyEi1a5sZib6S3K5ajlXcxDZ27cPi4aOqo9fbtU0AwM2H4IMcjIxUuwcfGT5/Wzbs3wcAANeBS10AAMA0CD4AAMA0CD4AAMA0CD4AAMA0CD4AAMA0CD5Ojrc3AwBgPwQfJ8fbmwEAsB+GD5wcb28GAMB+CD7Ojrc3AwBgN1zqAgAApkHwAQAApkHwAQAApkHwAQAApkHwAQAUmqebUeAy4GwIPgCAQmsWlF7gMuBsuJ0dAFBoD1a/KEk6kOSh2v4ZtmXAWRF8AACF5m6VetUk7MB1cKkLAACYBsEHAACYBsEHAACYBsEHAACYBsEHAACYBsEHAACYBsEHAACYBsEHAACYBsEHAACYBsEHAACYBsEHAACYBsEHAACYBsEHxc7TzShwGQCAkkLwQbFrFpRe4DIAACXF3dEF4Ob3YPWLkqQDSR6q7Z9hW8bNiRE+AM6M4INi526VetUk7JhFs6B0HUn2yLEMAM6C4APArhjhA+DMCD4A7IoRPgDOzG7BJzMzU1u2bFFsbKySkpJUtmxZ1alTR7fddpu9ugAAACiSIgefzMxMffPNN/rqq6+UnJyca3uFChX0wgsvqGfPnkXtCgAAoEiKFHwMw9CLL76oNWvWyDAMeXl5qWbNmvL19dWFCxcUGxurkydP6pVXXlF0dLTGjBljr7oBAABuWJGCz9KlS7V69Wr5+PjolVdeUc+ePeXp6WnbnpaWpsWLF2vy5Mn6z3/+ozvuuEO33357kYsGAAAojCI9wHDhwoWyWCyaMmWKHn300RyhR5K8vb312GOPaeLEiTIMQ7Nnzy5SsQAAAEVRpOBz4MABVa1aVZ07dy5wv/vuu0+VK1fWrl27itIdAABAkRT5lRWlS5e+rv2CgoKUmppa1O4AAAAKrUhzfJo0aaLw8HAdPXpUVapUyXe/c+fOKSYmRk2bNi10Xz/++KMWL16sqKgopaamqmzZsmrXrp2eeeYZ1a5du9DtAgAA8yjSiM+IESMkScOHD9fp06fz3OfSpUsaO3asMjIyNHTo0BvuwzAMjRo1SmPGjNH27dtVu3ZtdezYUW5ubvrhhx/Uq1cvhYWFFeUwAKdhWN0LXAYAFE2RfqomJibqkUce0fz583Xvvfeqe/fuatKkiQICApSSkqKYmBitXLlSJ06cUJ06dRQeHq7w8PBc7YwcOTLfPpYtW6YVK1aofPny+vrrr1W/fn1JUlZWlqZOnaovvvhCY8aM0Zo1a+Tn51eUwwEcLrNMVbmnnsmxDACwnyIFn+eee04Wi0WSlJycrEWLFmnRokU59jGMy29m3r9/v/bv359rm8ViKTD4LF68WJI0atQoW+iRJDc3Nz3//PNau3atYmJitHHjRnXr1q0ohwM4XFqlZpIkt4sJyvIrb1sGANhHkYJP69at7VVHvvz9/VW7dm21atUq1zaLxaKaNWsqJiZGJ0+eLPZagGJnsSqtcgtHVwEAN60iBZ85c+bYq458ffrpp/luy8rKUmRkpCSpUqVKxV4LAABwbUW+nd2R5s2bp6NHjyogIEDt27d3dDkAAMDJuWzw2bx5syZNmiRJGj16NBObAQDANV33pa7OnTvLYrFo9uzZqlatmm3djbBYLFq3bt0NfSYv69at0/PPP6/09HT169dPjzzySJHbBAAAN7/rDj4nTpyQxWJRZmZmjnU34sodYEUxZ84cTZw4UVlZWRowYIDeeOONIrcJAADM4bqDz8SJEyVJ5cuXz7WuJGRmZmr8+PFasGCBLBaLXnjhBQ0ZMqTE+gcAAK7vuoPPww8/nGvd0aNHVblyZfXq1euan//888918ODBPNu5lrS0ND333HMKCwuTj4+P3nvvPd1777033A4AADC3Ik1unj59upYsWXJd+65Zs0ahoaE33EdWVpYt9JQtW1azZ88m9AAAgEK57hGfo0ePavPmzbnWJyQk2J6unBfDMHTs2DFFR0fL19f3hgv8/PPPFRYWJl9fX82aNUt169a94TYAAACkGwg+ZcuW1bRp03Tq1CnbOovFoiNHjlzXBGPDMG74WTvnz5/XzJkzJUkVKlTQl19+me++PXr0UKdOnW6ofQAAYC7XHXy8vb01evRoTZkyxbbu2LFj8vT0VLly5fL9nNVqla+vrxo2bKgxY8bcUHHh4eFKSUmRJMXGxio2NjbffRs0aEDwAQAABbqhV1b06NFDPXr0sC3Xr19fTZo00dy5c+1emCR17dpV+/btK5a2AQCA+RTpXV3Dhg3jHVkAAMBlFDn4AAAAuAqXfVcXAADAjSL4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA0yD4AAAA03B3dAE3G4tFcrdaHF3GDXG3WpSdnS1JMqweMqyZDq6oEKwetmO48v/icKVtD6tFWW4le54zsw0ZRol2CQA3HYKPHaSmpuruekGqVdZbpbxd74/U3WrRvn37JEnprUdJRvEFh2JjseriX8eQmZlVbN2cOeMmSRrZ+VZll3QKMaSTyZe0PS5Ju44lKyubFAQAN8r1fks7maSkJB09elQd6wTJ29NdHm5WWSyuNeIjSZmZl8OOJeBWB1dSeFeOoST6qBpUqtj7+jvDMFTe30fVAn1UuYy3VkYmlHgNAODqCD5FkJ5+SadPJygrK1ulS5VSpsVLGRY3Sa4VfNysVlWuFCBJyjixz2VHfDwqXg5txRmA3N0vT4uLPna25Ed8ZMjDLV0V3N3Uspqhg6dTtPfkxRKuAQBcG8GnCNLSLio725CXl48uGO5y2QsPFousVuuVL12TRbZjsBbjlP0rfTjmD8qibDdvWZQtf58M1b/Fj+ADADeIu7qKIC0tRYZhqFSp0i6cGOBqsi2e8vJwV40gH0eXAgAuh+BTSIZhKDs7S4YheXh4ObocmIhhscrdapWPp5tc7AZCAHA4gk8hGVfN73DFycxwZRbbAKMbyQcAbgjBBwAAmAbBBwAAmAbBBwAAmAbBBwAAmAbBBwAAmAbBBwAAmAbBBwAAmAbBBwAAmAbBBwAAmAYvKUWhJSSe0bylK7QjMkrHTyXIMKQK5YLUqlljPdrjXlWqUD7XZzaEb9Py1esUtf+gklNSFODvr+aN6qvPg90VXLuGbT/DMPTCuPe0/c89Cgooo9mfvCf/0qVytDVh2pf6ZV2YygUF6pspE1WhUnEfMQDA1THig0I5euKknh79hkJ+WqNjJ0+pYoXyqnRLeR0/maCQlas18MXXFH0w1rZ/ZlaW/v3x53rtvY/1x/adslgsqlP9VqWnZyh0w2YNefkthfy0xra/xWLRq8MHq3QpP505d16fzJyTo/9fN27RL+vCZLVa9NrIwQrwL11Shw4AcGGM+KBQvpq7SGfPJ6lz+9YaO+wZ+fp4S5LOnDuv19//RLv3xWjGdws1+c0xkqSZ8xdrze+bVL5skF4eOkhtWjSVJGVlZeuHX0I1/dt5mjpzjm6tXFGtmzeRdHn0aNTgpzTuw+la8/sm3X1He7Vv1VwnTydq8hffSJIG9Oqhlk0aOeBPAADgilxyxCc2NlbNmzfX+PHjHV2Kae2PjZMkde14uy30SFJQQBmNGPSY2rZoqhrVqkiSzp47r0XLV0mSJox9wRZ6JMnNzare93fToz3ulWEY+nr+4hz9dOnQVt06dZAkTf7yP0q+mKIJU79U8sUUNQ6uq6f69CrW4wQA3FxcLvicPn1aQ4cOVWpqqqNLMbWqlW6RJH353UJtCN+mS5fSbdvq16mlD954ScOeGiBJ+mP7TqVnZKhGtSo55vFc7Z6/ws3emIM6e+58jm0v/OsJVSxfTgmJZzRk7NuK2L1Xpfx89eYLQ+Xu5lYMRwcAuFm51KWuvXv3auTIkTp8+LCjSzG9Qf16K2L3Xh05elyvvfexPD081Ci4jlo3a6x2tzVTnZrVbfsePBIv6fJk6Ode/Xee7WUb2bavDx89rsCAMrZlP18fvTZyiEa++a6OHD0mSXrp2YGqWKFccRwaAOAm5hLB5/z585oxY4Zmz56t9PR0Va1aVfHx8Y4uy9Tq1qyu/3z0rr5bslwbtmzV+QvJiti9VxG792rG3EWqVb2aXnzmCTVtEKyLKZdH5y6mpOrPqOhrtp18MSXXuvq1a6pcUJBOnU6Uu7ubalStYvdjAgDc/Fwi+MyePVtff/21KlasqLfeekuRkZGaPn26o8syvcoVK2jM0EEaPeQp7TsQqx2Re7VtV6S2796jg4fjNHr8JM2ZNkneXl6SpE7tWuvfY0YUqq9PZ83TqdOJslotyszM0juffKEv3hsnDw+X+BYGADgJl5jjU7FiRb388statWqVunTp4uhyTM8wDB0/laD/7vhTkmS1WtWgbi3163m/Jr85RrM+nig/Xx+lXUrX739s1a1VKkqSDsUdzbfNtEuXtCNyr46dOKWsrOwc27Zs36Ufflkrq9Wi914dpbKBAYo5dDjXRGgAAK7FJYLPI488ooEDB8rb2/vaO6PYJSUnq/9zL2nU+EmK2n8w1/ZqlSupQrmykqTs7Gy1u6253KxWHTl6zBaW/m7h8l804o0JGjjqNaVdumRbfy7pgiZOnyFJerTHfWp3WzO9+MwTkqQFy37Sjsgoex8eAOAm5hLBB86lTOnSavvXLekTp3+lw/HHbNuys7O19OdQHToSL4vForYtmqpihXJ6oGtnSdL4KZ9p43+359h/xZrf9J8FSyVJD993t/x8fWzbP/j8G505d163VqmkQf16S5LubNtKd93RTtnZhiZM/dI2hwgAgGthggQKZfSQgXp27DgdOhKvJ54fq0oVyquUn59OJJzW+aQLkqRnBjxqe5bPsKcGKCHxjDZt3aFXJk5RuaBAlQsK1IlTCTr31/6d27fW0/0esfWxIvQ3bdiyVVarRWOH/Utenp62bSOf/j9t/3OPTiSc1sdfzdJrzw8twaMHALgqRnxQKOWCAjRj0tvq17O7qletosSz53Tg8BF5enjorjva6dMJb2hArwds+3t5emriKy9q3KhhatuiqTIyMxVz6LCysrPVonEDvTp8sMaNGiY3t8vfksdOnNK0b+ZKkv55/71qHFw3R/8B/qX1/L/+T5K0av1G/brxjxI6cgCAK2PEB4UWGFBGz/5fPz37f/2ua3+LxaIuHdqqS4e219y3csUKWjXvqwL3+cftbfWPJX+1ZSHDAwCujd8WAADANAg+AADANAg+AADANAg+AADANAg+AADANFzyrq7hw4dr+PDhji4DAAC4GEZ8AACAaRB8AACAaRB8AACAaRB8AACAaRB8AACAaRB8AACAaRB8AACAabjkc3xcidVicXQJ15Sjxr+/5dzILtliAAAoRgSfYmS1WNS+cTVHl3FjAm/LsXhyz1bCDwDgpsGlLgAAYBqM+JSQu8ctVGp6pqPLuC4+nu4KHfeo3duN2L1XI9+cYFue9fFE1by1aoGfeemdD7Rl+y5J0ivD/qX7unQsVN/vvjtOP/+8QkOHjlT//o8Xqg0AgOsj+JSQ1PRMpWW4RvApKWvD/tDT/f+Z7/ZzSRe0dWdkCVYEALjZcakLJa6Un68k6deNWwrcb93GLcrKypKnh0dJlAUAMAGCD0pc+aBANaxbW/HHT2jfgUP57he6YbN8vL3VtGFwCVYHALiZcakLDnF3x/baE3NAa8P+UHDtmrm2n0w4rd37YtSt4+26mJqaa3t2drZ+3bhFq9aHKebgYSUlJ8vT01tVq1ZTx46d1a/fY/Ly8r6uWnbu3KHvv/9Ou3fvUnLyBQUFlVW7drfr8ccHqmLFikU+VgCA82DEBw7xj9vbys1q1bqNW2QYRq7tazZslmEY6trx9jw/P37KZxo/5TPt2B2lWtWrqUPr21S9enVFR0fp66+/0Msvv3hddcyf/52GDfuXwsLWq0KFW9Shw53y9vbWjz8u0cCBA7Rnz+4iHScAwLkw4gOHKBsYoOaNG2jbrkjtjopRkwb1cmwP3bBZQQFl1LJpY/2wam2ObRv/u12/btyiihXK6fOJb6lsYIBkscqzUgNt2/ZfjRgxVFu3huvgwQOqVat2vjVERGzTZ599Ij+/Upo4cbJatGhp2xYSskBTpnyg119/WfPnh1z36BEAwLkx4gOHueuOdpIu3911tUNH4nXwcJy6dGgnN7fc36LpGRm6s20rPTPg0cuh5yotW7a2hZ3jx48V2P+8ebNlGIaGDBmWI/RIUu/efdS+fQedOnVSq1f/cqOHBgBwUgQfOEyn9q3l4e6u3zaHKyvrf0+HXvP7JknK9zLXP25vq3dfHqm772xvW5eVla3Dh2P1yy8/KSkpSZKUkZGeb99ZWVmKiNgmSWrdum2e+7Rvf4ckadu2/97AUQEAnBmXuuAwpf381Pa2pgoL364dkXvVsmkjGYah0LDNqla5ohrUrZXvZ1PT0vTTrxv0x7Ydijt2QidPJyorK0uSZPnr3WN5zR26IinpvNLS0iRJffr0LLDOkydP3OCRAQCcFcEHDnXXHe0VFr5da8P+UMumjbQ7KkYnTp3WwL698v3MkaPH9fxbE3X6zFn5+nirfp1aateyueo1ba2mTZtr0qSJ2rFje4H9ZmdfHmGyWCzq2vXeAve95Rbu7AKAmwXBBw7VoXUL+Xh76/c/turFwU8qNGyzpPwvc0nSlK9m6fSZs+ra8XaNGTpIXp6etsnNknThQtI1+y1TJkAeHh7KyMjQ8OEvKDAwyD4HBABwaszxgUN5e3npjja3KSk5Wf/d8ad+2xSuRvXqqErFW/L9zJ9R0ZKkx3r1uBx6rnLixHHFxl5+KGJ2dv6Xutzd3dW4cVNJ0saNG/Lc5/PPp2ngwMe0ePH3N3RMAADnRfApIT6e7vL2cI3/fDxLdiDw7jsuT1L+bNZ8nT2fpLsLGO2RpDKlS0uSft+yNcf6Y8eO6uWXR9nm+qSnXyqwnX79Lr+s9LPPpmr79pxtrV+/TgsWzFV0dJSCgxtc/8EAAJwal7pKSHG87fxm0bp5Y5UpXUqH44/Jzc1Nd3XI+y6rK/r3vF+fzJyjmfND9PsfW1WlYgUlnj2vPTEHJFl0663VdeTIYZ05k1hgO7fffoeefPJpffvt1xoxYojq1QtWpUqVdezYUcXEXB5VGjJkmJo0aWavQwUAOBgjPnA4d3d3dWzXWpLUulljBZTxL3D/3vd307/HjFDj4Lo6mZCoLRF/6vyFZN11V1fNnDlLQ4YMlyRt2LD+mn0//fQQffzxZ7rjjo46deqUNm0KU1JSkjp0uFNTp36hxx57ssjHBwBwHoz4FKNsw9Dm3XGOLuOa3KxW1a0UIElKP7FPMv73TJ0cXxdRi8YN9PuSOXlue+nZgXrp2YF5bpsw9oVc6zq1a61Of4UlSTkmN9epE6ywsJyXrl57bZxee21cnu23atVGrVq1uY4jAAC4OoJPMcsu4FkyzsJydY1Gtl3DDgAAzoRLXQAAwDQIPgAAwDQIPgAAwDQIPgAAwDQIPgAAwDQIPgAAwDQIPgAAwDQIPgAAwDQIPgAAwDQIPgAAwDR4ZUUxs1osji7hmnLUaPlbFub1FQCAmwjBpxhZLRa1b1zN0WXcmMDbciye3LOV8AMAuGlwqQsAAJgGIz4lJH5yJxkZqY4u47pYPHxUdfR6u7d7/FSC+gx58br2LeXrq5+++9LuNZSEl559TIkJJ/XGe9NVs06wo8sBAFyF4FNCjIxUlwk+JaFrx9sL3O7t5VVClQAAzITgA4d44/lnHV0CAMCEmOMDAABMgxEfuIRde/dpwY8/a/e+GCVfTFFQQBm1va2ZHu/dQ7eUL5dj32HDntGOHdsVErJCGzdu0I8/higuLk5+fn5q376DnntupMqUCdDPP6/QokXzdfhwrAIDg9S2bXsNHjxM/v7+OdpLSbmoJUsWKSzsdx05EquLF1Pk7eOjatVr6c677lX7jndf1zEYhqFN69dow9pfFHf4gDIzM1XhlspqfXsn3dOjt7y8fez25wUAyBvBB07v+x9/0uezv5ck1atVQ00bBOtQ3FEtW/2rftsUrklvjFbDenVzfe7DD9/Tpk1hatKkqVq3bqOdOyP000/LFRd3WE2aNNP8+d+pQYNGatOmvbZuDdePPy5RTEy0Zsz41tZGUtJ5DR36tGJjD6ls2bJq0qSp3NzctS86RlGROxUVuVOnE06qR+8BBR5DdlaWPvvw39oevlGenl6qUaeeSpXy1/59kfphwSxt27JBL731gUqV9i+wHQBA0RB84NR2RO7V57O/l5+vjyaMfV7NGzWwbQv5aY0++Xq23pg0VfM+/VCef/vsli2b9dFH09WmTTtJUmzsIT3xRF/9+ecuRUbu1qRJU9S+/R2SpLi4I3riiX7as2e39u2LUnBwfUnSrFnfKDb2kDp0uFPvvvuBvL0v97I3PlHLQuZq6fxvtWbl0msGnxVL5ml7+EbdWrOOhr30lspVqChJSr90Sd9+MUV/bFirWV9M0XMvvWWPPzYAQD4IPnCIjr0ez3db80b1NfXfr0mS5i1dKcMwNPixPjlCjyT17t5VW7bv1B/bd2rN7xvVq0azHNvvuqubLfRIUo0aNVW/fkNFRv6pf/zjblvokaRq1W5V/foNtGvXDsXFHbYFn9KlS6tdu9s1dOhIubv/76+LxWLRXfc+pKXzv1Vy0nmlpabK2yfvS1WZGRlavWKJJGnw86/aQo8keXp56YnBIxW5c5u2h2/UyePxuqVS1QL/7AAAhUfwgUMUdDt79aqVJUlZWdnaEblXktS6WeM8923fsrn+2L5T2/+MVK+/bWvUqEmu/QMDAyVJwcENcm27MrcnPT3dtu7JJ5/OtV9aWppiD8YoJirSti4zM0NS3sHn8KEYpVxMVlC58qpUJfeTvL28fRTcqKm2bv5de3fvJPgAQDEi+MAhrud29qQLF5R26XII6Tt0VIH7nkxIzLXu75OUpcsjNZIUEBCQ77a/O3XqpJYuXaxdu3bo6NE4JSYmyjCMHPsbhpFvbYmnEyRJZ04naOA/uxZ4HGdOnypwOwCgaAg+cFrZf4UJi8Wiu+9sX+C+FcuXz7Xu6ktThfXbb2v19tuvKyMjQ2XLllODBg1Vs2Yt+ZWtrLoNmmjU4H7XbMPIvvyuszIBQWrQpEWB++Y1IgQAsB+CD5xWmdKl5OHurozMTA17sr8CA8rkv/Pf3ypvB6mpqXrvvX8rIyNDL7zwknr1elQeHm6SpKijZ5SUdP662gkIDJIk+ZYqpWdGjrV7nQCA68cDDOG03N3d1bj+5dvUN23bkec+X8xZoKdHv6GQlavs3v/BgweUnJysgIAA9e7dJ9elsD8j/mv72ijgDfY16gTL08tbp44f1Ylj8bm2G4ahD94eo3dfHal9e3bZ7wAAALkQfEqIxcPHpf5zFn0f7C5J+nzW94rYvTfHtt//2KqFy39W9MFY1atd0+59X5kHdO7cOe3cuSPHtj1/Rmj+fz6zLWekZ+TbjpeXt7rc00NZWVn68uMJSjh53LYtOytLi+fO1N4/I3TiWJxq1Mr9PCIAgP1wqauEFMfbzs2gfavmeuKRnpq16AeNfHOC6tasrkq3lNfxkwmKOXRYkjT4sT5qUr+e3fuuUqWqOnX6h9avX6cRIwarWbMWKlOmjI4cOawDB/arVGl/lQkI0vlzZ3T+3BmVLV8h37Ye7vek4mIPKHLXdr3+wtOqUaueSvuX0eGDMUo8fUqenl4aOvpNnt4MAMWM4AOnN6hfbzVvVF+LV65W5L4YxcYdVVBAGd3eqoX6PHifWjTOfWu6vbz11rtavPh7/fLLSu3dGylPTy/dcsstuueB3rrnoUf00w8LFLpyqSLCN6pW3fr5tuPh4akXXpugDb+u0qb1axR/5KAyMzMVVK6COt7dXfc99Ai3sQNACSD4FKNsw9Dm3XGOLuOa3KxW1a0UIElKP7FPunq+SgFzV25UpQrl9fuSOYX6bMumjdSyaaPr2nf69Bn5bps48cMb2ubp6an+/f9P/fv/nyTJ3f3y1eGoo2eUbRjq/9RQ9X9qaI7PfPD5d3m2b3VzU6eu3dWpa/drHgMAoHgQfIpZdgHPd3EWlqtrNLLtGnYAAHAmTG4GAACmQfABAACmQfABAACmQfABAACmQfABAACmQfABAACmQfAppKvf22S4wC3ruJkYuvItl5XN9x4A3AiCTyFZLBZZrW6yWKSMjEuOLgcmYjGylZmdrdT0LJF7AODGEHyKwNvbVxaLRcnJFyRGfVBCrEa6LmVkKvZMqqNLAQCXw5Obi8Db20/p6Sm6dClVblkWGRYvGRY3SZZrftapGIays7OvfCm5aIa7cgxX/l88ffz1hWE4IOwasmany5KZpqTUdEWdvFjC/QOA6yP4FIGnp5eqVKmio0eP6sK5C/L2TJOHmzXH/B9XcexYkiTJyJBcdSDQcuzIX18VZyC5fG7dMzKLsY+8GYahtIwsnU+9pG1xSdpL8AGAG0bwKSJ/f395eHho/pb1ql3WW6W8Xe+P1N1qUb3KQZKk9IQjrvmuLotVHpUuv6U9MzOr2Lq58pLS+JPJJf8eNkM6mXxJ2+OStOtYcsn2DQA3Cdf7Le2EfHx8tDb6jFZmZMpiuRwkXEkZHy/9/EZ7SVL8sqdlZLje3BGLh4+qvrRBkpSQcKHY+ilfvrQk6dm5C5SWWbKjPpnZBlPJAKCICD52ZhhSRpZr/XbKzDZktV4eybBkZ0jZGQ6u6MZZst1tx3Dl/8XhStsZ2YbLnWcAgKtO5gAAACgElxnxOXTokD799FNt27ZNiYmJqlixou677z4NHjxYvr6+ji4PAAC4AJcY8dm1a5d69eql5cuXq1y5curcubNSUlL0xRdfqG/fvkpOZqInAAC4NqcPPpmZmXrxxReVkpKid999V4sWLdLUqVMVGhqqLl26aN++ffroo48cXSYAAHABTh98Vq5cqbi4OLVv317//Oc/beu9vb01YcIE+fr6auHChTp//rwDqwQAAK7A6YPPr7/+Kknq2rVrrm2BgYFq27atMjIytGHDhpIuDQAAuBinn9wcHR0tSQoODs5ze506dbRu3TpFRUXpgQceKMnScvDxdPo/ynxdXbvFw8eBlRReSdfN+XYszvf143zfOM63YxV33RbDcO5HorVs2VLJyckKDQ1VtWrVcm2fPXu23n33XT300EOaNGmS3fo1DEOZmdd+grGHh5vd+oR9ZGQU35ObOd/Oh/NtLpxvc7mR8+3ufn2vjHL6WJuSkiLp8pyevFxZf2U/e7FYLPwlcFGcN3PhfJsL59tciuN8O/0cHze3ywd9rRTn5ANXAADACTh98PHz85Mkpabm/f6otLQ0SZfflwUAAFAQpw8+FSpUkCQlJCTkuf3UqVM59gMAAMiP0wefK3dz7d+/P8/tV9bnd9cXAADAFU4ffDp16iRJWrVqVa5tZ8+e1ZYtW+Th4aEOHTqUdGkAAMDFOH3w6dq1qypXrqywsDDNnTvXtj4tLU2vvfaaUlJS9M9//lPlypVzYJUAAMAVOP1zfCRpy5YteuaZZ5SWlqZGjRqpatWqioiI0KlTp9SwYUPNmTNHpUqVcnSZAADAyblE8JEuP8F5+vTpCg8PV0pKiqpWrap77rlHgwYNIvQAAIDr4jLBBwAAoKicfo4PAACAvRB8AACAaRB8AACAaRB8AACAaRB8AACAaRB8AACAaRB8AACAaRB8AAB54jFvuBm5O7oAXL9p06Zp+vTpN/SZYcOGSZKmT5+uAQMG6M033yyO0uAE4uPjddddd13XvqVLl9bWrVuvud/jjz+u8PBwffLJJ7r33nuLWiKKKDk5WfPmzdOvv/6q2NhYJScny9/fXzVr1lSnTp3Ur18/lS5d2i59/frrr/ruu+/0zTff2KU9XJ+SPMdmRfBxIcHBwerRo0eOdampqQoNDZWkXNuufGbfvn0lUh+cR17fC1fz9fUtoUpgL9HR0Xrqqad0+vRplS9fXk2bNpWvr68SEhIUFRWlrVu36ptvvtGMGTPUtGnTIvUVFRWlZ599VlWqVLFT9bgeJXmOzYzg40K6deumbt265VgXHx9vCz6TJ0/O83MEH/PJ73vhRr3//vtKTU3VLbfcYpf2UDhZWVkaPny4Tp8+rREjRujZZ5+V1fq/mQrJycmaOHGiFi9erMGDBys0NFR+fn6F7o9LXCWvpM+xmTHHB0C+KleurNq1a/MiYAfbtm2bYmNjVa9ePT333HM5fiFKUqlSpTR+/HjVqlVLZ86c0apVqxxUKQqLc1xyCD4ms337dj399NNq1aqVmjdvrt69e2vp0qW59nv88ccVHBysX375Jde2+Ph4BQcHq0WLFjnWd+nSRQ0bNlRcXJwGDBigxo0bq0OHDlq8eHGxHQ+KZtq0aQoODtYPP/yg999/X61atVKLFi00ZMgQSQV/H6DkJCYmXnMfNzc3DRw4UL169VLZsmVzbV+/fr2GDRumjh07qnHjxmrRooXuv/9+TZo0SWfPnrXtN3bsWPXs2VOSdPToUQUHB6tLly52OxbkrSjneMuWLQoODtYDDzyQ5+fGjh2r4OBgzZw507ZuyZIlCg4O1meffaaYmBiNGDFC7dq1U5MmTfTAAw9o5syZyszMLPqBOSEudZnIxo0b9f3336tixYpq166djh07pt27d2vs2LFKSEjQM888U+Q+DMPQ008/rZSUFHXu3FmRkZFq0qSJHapHcfryyy915MgRdejQQUlJSapZs6ajS8JVGjRoIIvFoujoaL3zzjsaPHiwypcvn2u/Rx55RI888kiu9ZMnT9ZXX30ld3d33XbbbWrevLkSEhK0c+dO7d+/X7///ruWLFkiT09PtWjRQmfOnNH69evl6+uru+66S0FBQSVxmKZW1HNcWDt37tSXX34pPz8/NW/eXMnJydq6dasmTZqkQ4cO6Z133rFbX86C4GMisbGxGjRokEaPHm0bRv3yyy/10UcfaebMmRo0aJDc3NyK1Ed2drYk6eeff1apUqWUnZ2da8gWzufgwYOaMWOGOnXqJOl/5xHOoUaNGurfv7/mzp2rOXPmaO7cuWrcuLFatWqlli1bqmXLlgoMDMzzs1FRUfr666/l7++v77//XrVr17Zti4mJUd++fRUTE6NNmzapc+fO6tOnj5o2bar169crMDDQbvPFULCinOOi+O2339SjRw+NHz/edtPDmjVrNGzYMC1evFgjR47MM4C5MoKPiVSpUiVH6JGkp556Sp988onOnTun48ePq2rVqkXup3fv3rY5IYQexwgODs53W5s2bTRnzpwc62rVqmULPRLnzRm9/vrrql69uj777DOdO3dOu3bt0q5du/TNN9/IYrGoWbNm6tu3r3r27CmLxWL73Llz53TPPfeoRYsWOUKPJNWtW1ft2rVTaGio4uPjS/qQ8DeFPcdF4ePjo7fffjvHnZ5du3ZV1apVFR8fr3379hF84LqaN2+e6xeap6enypUrp5MnT+rChQt26adBgwZ2aQeFV9Dt7H//5SdxzlyB1WrVE088oX79+mnz5s0KCwvTtm3bFBUVpaysLO3YsUM7duzQ0qVL9cUXX9h+kbVr107t2rXL0VZ2draOHj2qyMhIW+BJT08v8WNCToU9x0VRv379PO8Oq1ChguLj45WamlrkPpwNwcdE/P3981zv7n7528BeE9nKlCljl3ZQeDd6eSK/7w04H09PT3Xq1Mk2QpecnKzw8HAtXbpUq1ev1pYtW/T+++/r7bfftn0mPT1dP/30k1atWqWDBw/q2LFjtqBzZeSAW9idR2HOcWFd6/dCVlZWkftwNoxnm4i9Ll9ca/6HvYZgUXK4tOXcoqKitHnz5jxHZUqVKqUuXbpo2rRpGjt2rCRp2bJltu2JiYnq2bOnXn75ZW3cuFFly5bVww8/rNdff10hISF68MEHS+w4kL+inONrKSi8mPHnNT/tkKcrfxnyCjnnzp0r4WoAcxs0aJCefPJJ7dq1q8D9Hn30UUlSSkqK0tLSJEkfffSRDhw4oPbt22vDhg2aN2+exo8fr8cff1yNGzdWUlJSsdePayvKOb7yD5f8As758+ftWKnrI/ggT1euHZ8+fTrXtoiIiJIuBzC1li1bStI135t18OBBSZfvEPL29pZ0+dldkvTkk0/mugydnJxs+/t89T9yzDgK4GhFOcdXfl6fOXMm1yXLjIwM7d69297lujSCD/JUv359SdKiRYuUnJxsWx8ZGakvvvjCUWUBpjR06FB5eXlp7dq1GjVqlE6ePJlrn927d2v06NGSZHsApSTbLdChoaE5fimeOXNGI0eOtI3gXrp0ybbN09NT0uVgxKMNSkZRznHNmjXl6empc+fOacmSJbb1GRkZeuedd67r4YhmwuRm5Klv376aP3++oqOj1a1bN9122206e/astm/frk6dOmnHjh05flACKD7169fX9OnT9dJLL2nFihX66aef1KBBA1WpUkXZ2dk6dOiQDhw4IKvVqmHDhunhhx+2fXbgwIHavn27Fi1apG3btqlu3bo6d+6cIiIilJ6errp16yomJibH6G6lSpXk5eWl8+fPq2/fvrr11lt5nk8xK8o59vX11eOPP66ZM2fq1Vdf1eLFi1W2bFnt2LFDSUlJeuCBB7RixQoHHp1zYcQHeapYsaIWLlxouy16/fr1Onv2rEaPHq3p06cX+UGHAG5Mx44dtXr1ao0aNUpt2rRRQkKC1q9fr02bNikrK0t9+vRRSEiIhg8fnuNzd999t2bNmqXbb79d58+f1/r163Xy5Endeeed+vbbb/XBBx9IktatW2cb3fHx8dEHH3ygGjVqaM+ePdq4cWOO11qgeBT2HEvSSy+9pHHjxqlhw4aKjIxUeHi4mjdvrsWLF6tVq1YOOBrnZTG4hxEAAJgEIz4AAMA0CD4AAMA0CD4AAMA0CD4AAMA0CD4AAMA0CD4AAMA0CD4AAMA0CD4AAMA0CD4AAMA0CD4AXF58fLyCg4MVHBysw4cPO7ocAE6M4AMAAEyD4AMAAEyD4AMAAEyD4AMAAEzD3dEFAMD12rNnj2bOnKmtW7fq7Nmzql69uvr27auOHTvm+5nw8HAtWrRIEREROn36tDIzMxUYGKjmzZurf//+at++vW3fDz/8UDNmzFC9evW0fPnyPNvbunWrBgwYIH9/f4WFhcnLy8vuxwmg+DDiA8AlLFu2TI8++qhWrFih1NRU1a1bVwkJCRo/frxeffXVPD/z4Ycf6vHHH9eyZct08eJF1apVS5UrV9aZM2e0evVqPfnkk1qwYIFt/969e0uSoqOjFRUVlWebP/74oyTp/vvvJ/QALojgA8DpxcXF6fXXX1dGRoaeeuophYWFKSQkRBs3btSoUaMUHh6e6zNbtmzRjBkzZLVaNWHCBG3cuFFLlizR6tWrtXbtWrVp00aSNHXqVGVnZ0uSatSooZYtW0r6X8C52qVLl/Tzzz9Lknr16lVchwugGBF8ADi9r7/+WpcuXVKbNm00duxYeXp6SpLc3Nz0zDPP5BlCNmzYIE9PT3Xt2lW9e/eW1fq/H3cVK1bUyJEjJUmnT59WYmKibduVUZ/ly5crKysrR5uhoaG6cOGC6tatq6ZNm9r9OAEUP4IPAKe3fv16SfmPsvTr1y/XutGjR2vXrl364IMP8vyMt7e37eu0tDTb1/fdd598fX2VkJCgTZs25fjM0qVLC6wDgPNjcjMAp5aWlqbjx49LkurWrZvnPvXr15fFYpFhGDnWWywWWa1Wbd26Vfv371dcXJyOHDmiffv25XjC85VLXZLk6+ur++67TyEhIfrxxx915513SpItCLm7u+vBBx+092ECKCEEHwBO7fz587avfX1989zH09NTPj4+SklJsa0zDEOzZs3SzJkzderUKdt6i8WimjVr6qGHHspzHo90+XJXSEiIQkNDdfHiRfn5+WnZsmXKyspSly5dVK5cOTsdHYCSRvAB4NQCAwNtXycnJ+e5j2EYSk9Pz7Hu008/1bRp0yRJ3bt3V8eOHVWnTh3VqlVLfn5+io2NzTf4tGzZUjVr1tShQ4cUGhqaIyRdmQMEwDUxxweAU/P09FSVKlUkSXv37s1zn4MHDyozM9O2nJGRoZkzZ0qSnnvuOU2ZMkUPP/ywmjRpIj8/P0nSiRMnCuz3yjyeNWvWKC4uTvv27VNQUJA6depU5GMC4DgEHwBOr1u3bpKkBQsW5LrTSpIWLVqUY/ns2bO2y16NGjXKs82rP3N1aLri4Ycflru7u8LCwrRixQpJ0oMPPigPD4/CHQQAp0DwAeD0Bg0apICAAEVGRuqVV16xXfIyDEPz5s3T7Nmzc+wfFBSkgIAASdK3336bY57QmTNnNG7cOFuYkXLe1XVF+fLldeeddyo1NVUzZsyQxN1cwM3AYvz9NggAcEKbN2/WsGHDlJycLF9fX9WuXVsnTpxQQkKCunTpovXr1ysrK0urV69W9erVNW/ePL399tuSJB8fH9WoUUPp6ek6fPiwMjMz1bBhQx0/flxnz57VZ599prvuuitXn6GhoXruueckXR45WrJkSYkeMwD7Y8QHgEto3769li5dqj59+igwMFD79u2Tj4+Phg8frqlTp+bav3///vr222/VoUMHlS5dWjExMUpMTFSzZs305ptvauHChbb5OuvWrcuzz86dO9smVzOpGbg5MOIDAPk4e/as7rzzTlksFoWFhalMmTKOLglAETHiAwD5+OGHH5SRkaFu3boReoCbBM/xAYCrREdHq1SpUtqxY4ftEtqTTz7p2KIA2A3BBwCu8v777yssLMy2/Oijj6pJkyYOrAiAPRF8AOAqLVq00M6dO+Xh4aGePXvqxRdfdHRJAOyIyc0AAMA0mNwMAABMg+ADAABMg+ADAABMg+ADAABMg+ADAABMg+ADAABMg+ADAABMg+ADAABM4/8BCDKl50csFFMAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Plot tips\n", "sns.barplot(data=tips, x='day', y='tip', hue='sex');" ] }, { "cell_type": "code", "execution_count": 9, "id": "fc9f5f25-8075-4958-8cff-58944cde2209", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SourceSSDFMSFp-uncnp2
0day7.4469003.02.4823001.2980610.2757850.016233
1sex1.5945611.01.5945610.8338390.3620970.003521
2day * sex2.7858913.00.9286300.4856060.6926000.006135
3Residual451.306151236.01.912314NaNNaNNaN
\n", "
" ], "text/plain": [ " Source SS DF MS F p-unc np2\n", "0 day 7.446900 3.0 2.482300 1.298061 0.275785 0.016233\n", "1 sex 1.594561 1.0 1.594561 0.833839 0.362097 0.003521\n", "2 day * sex 2.785891 3.0 0.928630 0.485606 0.692600 0.006135\n", "3 Residual 451.306151 236.0 1.912314 NaN NaN NaN" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Extend ANOVA\n", "pg.anova(data=tips, between=['day', 'sex'], dv='tip')" ] }, { "cell_type": "markdown", "id": "261e294d-79fa-4c0a-9515-c12c275f4819", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Further cases can be handled such as:\n", "- Analysis of Covariance, ANCOVA - 'controlling' for a variable before the ANOVA is run, `pg.ancova`.\n", "- Repeated measures ANOVA - analysing fully repeated measures, all within-participants, `pg.rm_anova`.\n", "- Mixed ANOVA - analysing data with one variable measured between, and another within, `pg.mixed_anova`.\n", "\n", "The latter two will required your data in **long-form**. `\n", "pingouin` has loads of other options you can try too for many things outside of ANOVA." ] }, { "cell_type": "markdown", "id": "47e4e28e-0b24-49d1-b660-ed1964f12324", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "### Part 2 - `statsmodels` for general linear models\n", "Now for the main course. This approach will serve us for most of the rest of the module, and serve you well for the future!\n", "\n", "`statsmodels` is a package for building statistical models, and gives us full flexibility in building our models. It works in conjunction with `pandas` dataframes, integrating them with a *formula string* interface that lets us specify our model structure in a simple way. \n", "\n", "First, lets import it." ] }, { "cell_type": "code", "execution_count": 10, "id": "3ab8786c-d87b-4775-a115-5a4c56da3c93", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [], "source": [ "# Import statsmodels formula interface\n", "import statsmodels.formula.api as smf \n", "# looks a little different due to structure of package" ] }, { "cell_type": "markdown", "id": "677c6345-26d6-4796-96ce-8563a90ecd2d", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Let's build a model that predicts tip amount from the bill and number of diners. To do this, we use `statsmodels` `ols` function, pass the string that defines the model, and the data, and tell it `.fit()`. A lot of steps, but simple ones:\n" ] }, { "cell_type": "code", "execution_count": 11, "id": "ab4ec5c5-d1a4-415b-9e04-0760ab96efbc", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [], "source": [ "# Build and fit our model\n", "first_model = smf.ols('tip ~ 1 + total_bill + size', data=tips).fit()" ] }, { "cell_type": "markdown", "id": "a63a6b78-60b2-491c-8561-8168e536c230", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Things to note:\n", "- The names of the included variables are the column names of the dataframe.\n", "- The DV is on the left and separated with `~`, which can be read as 'is predicted/modelled by'.\n", "- The `1` means 'fit an intercept`. We almost always want this.\n", "- We include predictors by literally adding them to the model with a plus.\n", "\n", "Once we have fit this model, we can ask it to provide us with a `.summary()`, which gives the readout of information in the regression." ] }, { "cell_type": "code", "execution_count": 12, "id": "10796c9d-a9c0-435f-8864-ef9450fbf454", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
OLS Regression Results
Dep. Variable: tip R-squared: 0.468
Model: OLS Adj. R-squared: 0.463
No. Observations: 244 F-statistic: 105.9
Covariance Type: nonrobust Prob (F-statistic): 9.67e-34
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err t P>|t| [0.025 0.975]
Intercept 0.6689 0.194 3.455 0.001 0.288 1.050
total_bill 0.0927 0.009 10.172 0.000 0.075 0.111
size 0.1926 0.085 2.258 0.025 0.025 0.361


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/latex": [ "\\begin{center}\n", "\\begin{tabular}{lclc}\n", "\\toprule\n", "\\textbf{Dep. Variable:} & tip & \\textbf{ R-squared: } & 0.468 \\\\\n", "\\textbf{Model:} & OLS & \\textbf{ Adj. R-squared: } & 0.463 \\\\\n", "\\textbf{No. Observations:} & 244 & \\textbf{ F-statistic: } & 105.9 \\\\\n", "\\textbf{Covariance Type:} & nonrobust & \\textbf{ Prob (F-statistic):} & 9.67e-34 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n", "\\begin{tabular}{lcccccc}\n", " & \\textbf{coef} & \\textbf{std err} & \\textbf{t} & \\textbf{P$> |$t$|$} & \\textbf{[0.025} & \\textbf{0.975]} \\\\\n", "\\midrule\n", "\\textbf{Intercept} & 0.6689 & 0.194 & 3.455 & 0.001 & 0.288 & 1.050 \\\\\n", "\\textbf{total\\_bill} & 0.0927 & 0.009 & 10.172 & 0.000 & 0.075 & 0.111 \\\\\n", "\\textbf{size} & 0.1926 & 0.085 & 2.258 & 0.025 & 0.025 & 0.361 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n", "%\\caption{OLS Regression Results}\n", "\\end{center}\n", "\n", "Notes: \\newline\n", " [1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/plain": [ "\n", "\"\"\"\n", " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: tip R-squared: 0.468\n", "Model: OLS Adj. R-squared: 0.463\n", "No. Observations: 244 F-statistic: 105.9\n", "Covariance Type: nonrobust Prob (F-statistic): 9.67e-34\n", "==============================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "------------------------------------------------------------------------------\n", "Intercept 0.6689 0.194 3.455 0.001 0.288 1.050\n", "total_bill 0.0927 0.009 10.172 0.000 0.075 0.111\n", "size 0.1926 0.085 2.258 0.025 0.025 0.361\n", "==============================================================================\n", "\n", "Notes:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "\"\"\"" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Show the summary of the fitted model\n", "first_model.summary(slim=True)\n", "# slim=False has more, but less relevant, info" ] }, { "cell_type": "markdown", "id": "b114ceba-d5eb-46b1-ab57-6a587a5ba48c", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "The `formula` interface is very flexible and allows you to alter the variables in the dataframe by modifying the formula. For example, if we want to z-score our predictors, we can use the `scale` function directly in the formula, and it will adjust the variables for us:" ] }, { "cell_type": "code", "execution_count": 13, "id": "d6f6956d-4c2a-4ae2-ad50-09db6211956f", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
OLS Regression Results
Dep. Variable: tip R-squared: 0.468
Model: OLS Adj. R-squared: 0.463
No. Observations: 244 F-statistic: 105.9
Covariance Type: nonrobust Prob (F-statistic): 9.67e-34
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err t P>|t| [0.025 0.975]
Intercept 2.9983 0.065 46.210 0.000 2.870 3.126
scale(total_bill) 0.8237 0.081 10.172 0.000 0.664 0.983
scale(size) 0.1828 0.081 2.258 0.025 0.023 0.342


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/latex": [ "\\begin{center}\n", "\\begin{tabular}{lclc}\n", "\\toprule\n", "\\textbf{Dep. Variable:} & tip & \\textbf{ R-squared: } & 0.468 \\\\\n", "\\textbf{Model:} & OLS & \\textbf{ Adj. R-squared: } & 0.463 \\\\\n", "\\textbf{No. Observations:} & 244 & \\textbf{ F-statistic: } & 105.9 \\\\\n", "\\textbf{Covariance Type:} & nonrobust & \\textbf{ Prob (F-statistic):} & 9.67e-34 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n", "\\begin{tabular}{lcccccc}\n", " & \\textbf{coef} & \\textbf{std err} & \\textbf{t} & \\textbf{P$> |$t$|$} & \\textbf{[0.025} & \\textbf{0.975]} \\\\\n", "\\midrule\n", "\\textbf{Intercept} & 2.9983 & 0.065 & 46.210 & 0.000 & 2.870 & 3.126 \\\\\n", "\\textbf{scale(total\\_bill)} & 0.8237 & 0.081 & 10.172 & 0.000 & 0.664 & 0.983 \\\\\n", "\\textbf{scale(size)} & 0.1828 & 0.081 & 2.258 & 0.025 & 0.023 & 0.342 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n", "%\\caption{OLS Regression Results}\n", "\\end{center}\n", "\n", "Notes: \\newline\n", " [1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/plain": [ "\n", "\"\"\"\n", " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: tip R-squared: 0.468\n", "Model: OLS Adj. R-squared: 0.463\n", "No. Observations: 244 F-statistic: 105.9\n", "Covariance Type: nonrobust Prob (F-statistic): 9.67e-34\n", "=====================================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "-------------------------------------------------------------------------------------\n", "Intercept 2.9983 0.065 46.210 0.000 2.870 3.126\n", "scale(total_bill) 0.8237 0.081 10.172 0.000 0.664 0.983\n", "scale(size) 0.1828 0.081 2.258 0.025 0.023 0.342\n", "=====================================================================================\n", "\n", "Notes:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "\"\"\"" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Scale predictors\n", "scale_predictors = smf.ols('tip ~ 1 + scale(total_bill) + scale(size)', \n", " data=tips).fit()\n", "scale_predictors.summary(slim=True)" ] }, { "cell_type": "markdown", "id": "48ac5416-3206-41b9-84fa-393af7ca6148", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Extending to the DV is also simple - this is the 'standardised coefficients' you see in some statistics software:" ] }, { "cell_type": "code", "execution_count": 14, "id": "f8e1eca1-e94e-46f4-adae-a770f73d2e05", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
OLS Regression Results
Dep. Variable: scale(tip) R-squared: 0.468
Model: OLS Adj. R-squared: 0.463
No. Observations: 244 F-statistic: 105.9
Covariance Type: nonrobust Prob (F-statistic): 9.67e-34
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err t P>|t| [0.025 0.975]
Intercept -3.851e-16 0.047 -8.2e-15 1.000 -0.093 0.093
scale(total_bill) 0.5965 0.059 10.172 0.000 0.481 0.712
scale(size) 0.1324 0.059 2.258 0.025 0.017 0.248


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/latex": [ "\\begin{center}\n", "\\begin{tabular}{lclc}\n", "\\toprule\n", "\\textbf{Dep. Variable:} & scale(tip) & \\textbf{ R-squared: } & 0.468 \\\\\n", "\\textbf{Model:} & OLS & \\textbf{ Adj. R-squared: } & 0.463 \\\\\n", "\\textbf{No. Observations:} & 244 & \\textbf{ F-statistic: } & 105.9 \\\\\n", "\\textbf{Covariance Type:} & nonrobust & \\textbf{ Prob (F-statistic):} & 9.67e-34 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n", "\\begin{tabular}{lcccccc}\n", " & \\textbf{coef} & \\textbf{std err} & \\textbf{t} & \\textbf{P$> |$t$|$} & \\textbf{[0.025} & \\textbf{0.975]} \\\\\n", "\\midrule\n", "\\textbf{Intercept} & -3.851e-16 & 0.047 & -8.2e-15 & 1.000 & -0.093 & 0.093 \\\\\n", "\\textbf{scale(total\\_bill)} & 0.5965 & 0.059 & 10.172 & 0.000 & 0.481 & 0.712 \\\\\n", "\\textbf{scale(size)} & 0.1324 & 0.059 & 2.258 & 0.025 & 0.017 & 0.248 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n", "%\\caption{OLS Regression Results}\n", "\\end{center}\n", "\n", "Notes: \\newline\n", " [1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/plain": [ "\n", "\"\"\"\n", " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: scale(tip) R-squared: 0.468\n", "Model: OLS Adj. R-squared: 0.463\n", "No. Observations: 244 F-statistic: 105.9\n", "Covariance Type: nonrobust Prob (F-statistic): 9.67e-34\n", "=====================================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "-------------------------------------------------------------------------------------\n", "Intercept -3.851e-16 0.047 -8.2e-15 1.000 -0.093 0.093\n", "scale(total_bill) 0.5965 0.059 10.172 0.000 0.481 0.712\n", "scale(size) 0.1324 0.059 2.258 0.025 0.017 0.248\n", "=====================================================================================\n", "\n", "Notes:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "\"\"\"" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Scale predictors\n", "scale_all = smf.ols('scale(tip) ~ 1 + scale(total_bill) + scale(size)',\n", " data=tips).fit()\n", "scale_all.summary(slim=True)" ] }, { "cell_type": "markdown", "id": "ca6c64fd-2357-48f8-86c6-247ae7655bf4", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "#### Extra scores and attributes\n", "While the `.summary()` printout has a lot of useful features, there are a few other things to know about. \n", "- the `.fittedvalues` attribute contains the actual predictions.\n", "- the `.resid` attribute contains the residuals or errors.\n", "- `.summary()` doesn't show us the RMSE, or how wrong our model is on average. We can import a function from `statsmodels` to do that for us, which we do next.\n", "\n", "We need to import the `import statsmodels.tools.eval_measures` package, and use its `.rmse` function. We need the predictions and the actual data, which is easy to access!" ] }, { "cell_type": "code", "execution_count": 15, "id": "2c8ec745-f13b-4c25-a29c-e11ac28340aa", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/plain": [ "1.007256127114662" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Import it with the meausres name\n", "import statsmodels.tools.eval_measures as measures\n", "measures.rmse(first_model.fittedvalues, tips['tip']) \n", "# notice we put in the predictions, and then the actual values" ] }, { "cell_type": "markdown", "id": "62d995e0-89f3-44af-8d72-19e30edaeb5d", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "### Part 3 - Wait, its just the general linear model?\n", "Now we've seen how easy it is to fit models, we can demonstrate some equivalences between standard statistics and how they are instances of the general linear model. First, a correlation.\n", "\n", "A correlation is a general linear model, when you have **one predictor**, and you **standardise both the predictor and the dependent variable**.\n", "\n", "Lets re-correlate tips and total bill:" ] }, { "cell_type": "code", "execution_count": 16, "id": "9ff31dc0-034e-44fc-aae9-8e821f581431", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nrCI95%p-valBF10power
pearson2440.675734[0.6, 0.74]6.692471e-344.952e+301.0
\n", "
" ], "text/plain": [ " n r CI95% p-val BF10 power\n", "pearson 244 0.675734 [0.6, 0.74] 6.692471e-34 4.952e+30 1.0" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Correlate\n", "pg.corr(tips['tip'], tips['total_bill'])" ] }, { "cell_type": "markdown", "id": "80f8a602-0095-4ff8-a39e-63ceafe488ad", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Now lets perform a linear model, scaling both the DV and predictor (which is which does not matter):" ] }, { "cell_type": "code", "execution_count": 17, "id": "7bb7d7a0-e0dc-4a1c-9cf0-cff202868e5c", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
OLS Regression Results
Dep. Variable: scale(total_bill) R-squared: 0.457
Model: OLS Adj. R-squared: 0.454
No. Observations: 244 F-statistic: 203.4
Covariance Type: nonrobust Prob (F-statistic): 6.69e-34
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err t P>|t| [0.025 0.975]
Intercept 7.286e-16 0.047 1.54e-14 1.000 -0.093 0.093
scale(tip) 0.6757 0.047 14.260 0.000 0.582 0.769


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/latex": [ "\\begin{center}\n", "\\begin{tabular}{lclc}\n", "\\toprule\n", "\\textbf{Dep. Variable:} & scale(total\\_bill) & \\textbf{ R-squared: } & 0.457 \\\\\n", "\\textbf{Model:} & OLS & \\textbf{ Adj. R-squared: } & 0.454 \\\\\n", "\\textbf{No. Observations:} & 244 & \\textbf{ F-statistic: } & 203.4 \\\\\n", "\\textbf{Covariance Type:} & nonrobust & \\textbf{ Prob (F-statistic):} & 6.69e-34 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n", "\\begin{tabular}{lcccccc}\n", " & \\textbf{coef} & \\textbf{std err} & \\textbf{t} & \\textbf{P$> |$t$|$} & \\textbf{[0.025} & \\textbf{0.975]} \\\\\n", "\\midrule\n", "\\textbf{Intercept} & 7.286e-16 & 0.047 & 1.54e-14 & 1.000 & -0.093 & 0.093 \\\\\n", "\\textbf{scale(tip)} & 0.6757 & 0.047 & 14.260 & 0.000 & 0.582 & 0.769 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n", "%\\caption{OLS Regression Results}\n", "\\end{center}\n", "\n", "Notes: \\newline\n", " [1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/plain": [ "\n", "\"\"\"\n", " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: scale(total_bill) R-squared: 0.457\n", "Model: OLS Adj. R-squared: 0.454\n", "No. Observations: 244 F-statistic: 203.4\n", "Covariance Type: nonrobust Prob (F-statistic): 6.69e-34\n", "==============================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "------------------------------------------------------------------------------\n", "Intercept 7.286e-16 0.047 1.54e-14 1.000 -0.093 0.093\n", "scale(tip) 0.6757 0.047 14.260 0.000 0.582 0.769\n", "==============================================================================\n", "\n", "Notes:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "\"\"\"" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Linear model\n", "smf.ols('scale(total_bill) ~ scale(tip)', \n", " data=tips).fit().summary(slim=True)" ] }, { "cell_type": "markdown", "id": "34679c6e-408c-49a2-92a7-70cb1c46088e", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "source": [ "The intercept is as close to zero as our computer can handle, and the coefficient equals the correlation!" ] }, { "cell_type": "markdown", "id": "27a1439c-919d-4ed9-b95d-5cc51d4fe079", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "A t-test is also simple, comparing tips between females and males:" ] }, { "cell_type": "code", "execution_count": 18, "id": "787cae76-18d5-43a4-a5c6-645d98ff0026", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Tdofalternativep-valCI95%cohen-dBF10power
T-test-1.38786242two-sided0.166456[-0.62, 0.11]0.1854940.3610.282179
\n", "
" ], "text/plain": [ " T dof alternative p-val CI95% cohen-d BF10 \\\n", "T-test -1.38786 242 two-sided 0.166456 [-0.62, 0.11] 0.185494 0.361 \n", "\n", " power \n", "T-test 0.282179 " ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Conduct t-test\n", "pg.ttest(tips.query('sex == \"Female\"')['tip'], \n", " tips.query('sex == \"Male\"')['tip'],\n", " correction=False) # uncorrected t-tests are at least the same :) " ] }, { "cell_type": "code", "execution_count": 19, "id": "c3345dda-e419-4e02-a5b7-9b185a96e3da", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
OLS Regression Results
Dep. Variable: tip R-squared: 0.008
Model: OLS Adj. R-squared: 0.004
No. Observations: 244 F-statistic: 1.926
Covariance Type: nonrobust Prob (F-statistic): 0.166
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err t P>|t| [0.025 0.975]
Intercept 3.0896 0.110 28.032 0.000 2.873 3.307
sex[T.Female] -0.2562 0.185 -1.388 0.166 -0.620 0.107


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/latex": [ "\\begin{center}\n", "\\begin{tabular}{lclc}\n", "\\toprule\n", "\\textbf{Dep. Variable:} & tip & \\textbf{ R-squared: } & 0.008 \\\\\n", "\\textbf{Model:} & OLS & \\textbf{ Adj. R-squared: } & 0.004 \\\\\n", "\\textbf{No. Observations:} & 244 & \\textbf{ F-statistic: } & 1.926 \\\\\n", "\\textbf{Covariance Type:} & nonrobust & \\textbf{ Prob (F-statistic):} & 0.166 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n", "\\begin{tabular}{lcccccc}\n", " & \\textbf{coef} & \\textbf{std err} & \\textbf{t} & \\textbf{P$> |$t$|$} & \\textbf{[0.025} & \\textbf{0.975]} \\\\\n", "\\midrule\n", "\\textbf{Intercept} & 3.0896 & 0.110 & 28.032 & 0.000 & 2.873 & 3.307 \\\\\n", "\\textbf{sex[T.Female]} & -0.2562 & 0.185 & -1.388 & 0.166 & -0.620 & 0.107 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n", "%\\caption{OLS Regression Results}\n", "\\end{center}\n", "\n", "Notes: \\newline\n", " [1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/plain": [ "\n", "\"\"\"\n", " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: tip R-squared: 0.008\n", "Model: OLS Adj. R-squared: 0.004\n", "No. Observations: 244 F-statistic: 1.926\n", "Covariance Type: nonrobust Prob (F-statistic): 0.166\n", "=================================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "---------------------------------------------------------------------------------\n", "Intercept 3.0896 0.110 28.032 0.000 2.873 3.307\n", "sex[T.Female] -0.2562 0.185 -1.388 0.166 -0.620 0.107\n", "=================================================================================\n", "\n", "Notes:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "\"\"\"" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# As a linear model\n", "ttest_model = smf.ols('tip ~ sex', data=tips).fit()\n", "ttest_model.summary(slim=True)" ] }, { "cell_type": "markdown", "id": "395eda4b-a49b-43fc-8380-de09a07b4a7d", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "And we can confirm the mean difference is as the model suggests:" ] }, { "cell_type": "code", "execution_count": 20, "id": "748d6122-ecea-44d1-ba62-974fa88fee67", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
tip
sex
Male3.089618
Female2.833448
\n", "
" ], "text/plain": [ " tip\n", "sex \n", "Male 3.089618\n", "Female 2.833448" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/plain": [ "tip -0.25617\n", "dtype: float64" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Confirm mean difference\n", "means = tips.groupby(by=['sex'], observed=False).agg({'tip': 'mean'})\n", "display(means)\n", "display(means.loc['Female'] - means.loc['Male'])" ] }, { "cell_type": "markdown", "id": "961fd37b-a479-472e-98da-1af9c6bb1ccd", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "For a final graphical illustration, let us recode the `sex` variable of tips into a column that has:\n", "- Males are 0\n", "- Females are 1\n", "\n", "And plot that against the `fittedvalues`, and overlay the raw data." ] }, { "cell_type": "code", "execution_count": 21, "id": "5dc91ef0-a2c5-4df0-b191-363bb7c70293", "metadata": { "editable": true, "slideshow": { "slide_type": "fragment" }, "tags": [] }, "outputs": [], "source": [ "# Generate values\n", "female_one_male_zero = tips['sex'].case_when(\n", " [\n", " (tips['sex'] == \"Female\", 1),\n", " (tips['sex'] == \"Male\", 0)\n", " ]\n", ")" ] }, { "cell_type": "code", "execution_count": 22, "id": "c9793947-e3ee-47a4-b61c-775937702ef2", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAksAAAHHCAYAAACvJxw8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAABU+ElEQVR4nO3deZhT9aE+8Pec7MtkFgIMMMNlsQNMQR21LqCitkpdwKXVWytWbKvWrWixiNqqVXv1Wq1Xa10qLtWr9rpQLSpVilgrINSfVEUQqAM4DAyQ2TKZ7Dnn90dIJpkkZ7InJ/N+nsfHmZOzfKPJmfd8V0GWZRlERERElJRY6gIQERERlTOGJSIiIiIFDEtEREREChiWiIiIiBQwLBEREREpYFgiIiIiUsCwRERERKSAYYmIiIhIAcMSERERkQJtqQtQKWRZRjAolboYRERElAatVoQgCOntW+CyDBvBoISeHnepi0FERERpqKkxQ6fTpLUvm+GIiIiIFDAsERERESlgWCIiIiJSwLBEREREpIBhiYiIiEgBwxIRERGRAoYlIiIiIgWqDEs7d+7E4YcfjjvuuCPlPmvXrsWll16K4447Di0tLfjOd76Dl19+GbIsF7GkREREpHaqC0sOhwNXXXUVPB5Pyn1efPFFXHrppfjnP/+J5uZmHHPMMfjyyy/xi1/8AjfffHMRS0tERERqp6oZvLds2YKFCxdi165dKffZsWMH7rzzTlitVjz33HNobm4GAOzZsweXXHIJli1bhtmzZ+Pb3/52sYpNREREKqaKmqXe3l785je/wQUXXIBdu3ahoaEh5b5Lly5FKBTCj370o2hQAoCxY8fi1ltvje5DRERElA5VhKVnn30WS5cuRV1dHR599FGcc845KfddvXo1AOC0005LeG3mzJmoqqrCZ599hn379hWquBXL0e/Hxt29WNPahY27e+Ho95e6SERERAWnirBUX1+PG2+8EW+//TZOOeWUlPs5HA50dnZCp9Nh0qRJCa9rNJro9q1btxasvJXI0e/H5o4+9PmCCMky+nxBbO7oY2AiIqKKp4o+S+eff35a++3fvx8AYLfbIYrJc+CoUaPi9qX0tHUn71Df1u2B3aIvcmmIiIiKRxU1S+lyu90AAKPRmHIfg8EQty+lx+0PZbSdiIioUlRUWIrUJgmCMOS+nG8pM2a9JqPtRERElaKiwpLFYgEAeL3elPv4fD4AgNlsLkqZKkVjrSmj7URERJWiosLS6NGjAYQ7eqeqOYr0VYr0XaL02C16NNdXocqghUYQUGXQorm+iv2ViIio4qmig3e6ampqMHr0aOzbtw+7du3ChAkT4l4PhUJobW0FAEyZMqUEJVQ3u0XPcERERMNORdUsAcDs2bMBAO+8807Ca2vWrEFfXx+mTp2K+vr6YheNiIiIVKjiwtJFF10EjUaDxx9/HP/617+i2/fs2YM777wTAHDFFVeUqHRERESkNhXVDAcAU6dOxXXXXYf7778f3//+93H00UfDaDRi/fr1cLvdOP/883HGGWeUuphERESkEhUXlgDg8ssvx+TJk/HMM8/g008/hSAImDx5Mi688EKce+65pS4eERERqYggc8KhvAgEQujp4USXREREalBTY4ZOl95cgRXXZ4mIiIgonxiWiIiIiBQwLBEREREpYFgiIiIiUsCwRERERKSAYYmIiIhIAcMSERERkQKGJSIiIiIFDEtEREREChiWiIiIiBQwLBEREREpYFgiIiIiUsCwRERERKSAYYmIiIhIAcMSERERkQKGJSIiIiIFDEtEREREChiWiIiIiBQwLBEREREpYFgiIiIiUsCwRERERKSAYYmIiIhIAcMSERERkQKGJSIiIiIFDEtERERECrSlLgANb45+P9q6PXD7QzDrNWisNcFu0Ze6WERERFGsWaKScfT7sbmjD32+IEKyjD5fEJs7+uDo95e6aERERFEMS1Qybd2ejLYTERGVAsMSlYzbH8poOxERUSkwLFHJmPWajLYTERGVAsMSlUxjrSmj7URERKXAsEQlY7fo0VxfhSqDFhpBQJVBi+b6Ko6GIyKissKpA6ik7BY9wxEREZU11iwRERERKWBYIiIiIlLAsERERESkgGGJiIiISAHDEhEREZEChiUiIiIiBQxLRERERAoYloiIiIgUMCwRERERKWBYIiIiIlLAsERERESkgGGJiIiISAHDEhEREZEChiUiIiIiBQxLRERERAoYloiIiIgUMCwRERERKWBYIiIiIlLAsERERESkgGGJiIiISAHDEhEREZEChiUiIiIiBQxLRERERAoYloiIiIgUaEtdgEL6+9//jmeeeQafffYZvF4vRo8ejZNOOglXXnkl7HZ7qYtHREREKiDIsiyXuhCF8PTTT+Oee+6BIAhoaWlBXV0dPv30U+zfvx8jR47ECy+8gPHjx+fteoFACD097rydj4iIiAqnpsYMnU6T1r4VGZba29sxZ84cCIKApUuX4phjjgEA+P1+LF68GCtWrMBJJ52Exx9/PG/XZFgiIiJSj0zCUkX2WVq3bh0CgQBmzZoVDUoAoNfrcd111wEA1q9fX6LSERERkZpUZFjSaMJJcf/+/QmvORwOAEBtbW1Ry0RERETqVJFh6bjjjoNOp8Pnn3+O2267De3t7fB4PFi3bh1uuukmAMDll19e4lISERGRGlRknyUAWLlyJW655Rb09vbGba+trcWdd96JU089Na/XY58lIiIi9Rj2fZYAoLm5Gaeddhq0Wi1aWlpw8sknY9SoUeju7sYf/vAHtLW1lbqIREREpAIVWbO0ZcsWXHrppTAYDHj00UfR3NwMAAgEAvjtb3+Lp556CmPGjMFbb70Fs9mcl2uyZomIiEg9hn3N0l133YXu7m788pe/jAYlANDpdFi8eDGOPPJI7N27F6+88koJS0lERERqUHFhyefz4eOPP4YgCJg1a1bC64IgYPbs2QCATZs2Fbt4REREpDIVF5acTickSYIgCNEpBAaLbA8Gg8UsGhEREalQxYWlESNGoKamBpIk4b333ku6z5o1awAA06ZNK2LJiIiISI0qLiyJoogLL7wQAPDrX/8a27Zti74mSRIefvhhrF27FjabDd/5zndKVUwiIiJSiYocDRcIBHDttddi9erVEEURRxxxBKqrq/HFF1+gvb0dZrMZv//97zFz5sw8XpOj4YiIiNRi2C+kCwCyLGPZsmVYtmwZvvjiC/h8PowaNQqzZs3CZZddhvHjx+f1egxLRERE6sGwVAIMS0REROox7OdZIiIiIsoXhiUiIiIiBQxLRERERAoYloiIiIgUaEtdACo+R78fbd0euP0hmPUaNNaaYLfoS10sIiKissSapWHG0e/H5o4+9PmCCMky+nxBbO7og6PfX+qiERERlSWGpWGmrduT0XYiIqLhjmFpmHH7QxltJyIiGu4YloYZsz75BFypthMREQ13DEvDTGOtKaPtREREwx3D0jBjt+jRXF+FKoMWGkFAlUGL5voqjoYjIiJKgVMHDEN2i57hiIiIKE2sWSIiIiJSwLBEREREpIBhiYiIiEgBwxIRERGRAoYlIiIiIgUMS0REREQK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RqMxrbJ89NFHePrpp7Fx40Y4nU6MHDkSJ5xwAn7yk59g7NixOb9XIqLhJJN76sUXX4wNGzbgvffew7vvvos//elP2LVrF6xWK2bPno3FixejtrYWr732Gv74xz+itbUVI0aMwPHHH49Fixahuro67nwulwsvvPAC3n33XbS2tqK/vx8WiwVTpkzBd7/7XZx99tlpvQdZlvHaa6/hlVdewRdffIFAIIDx48fj9NNPx6WXXloWTY+sWRoGTj/9dGg0Gvz1r3+FLMsJr7/xxhuQZTllW/miRYuwaNEibNiwAVOmTMEpp5yCiRMnYvPmzXjwwQdx5ZVXplWOp556CvPnz8eqVatQX1+PU045BUajEf/3f/+Hc889F59++mlO75OIaDjJ9p56++2344477oDFYsHMmTPh9/uxbNkyXHnllbj33nuxZMkS6HQ6HH/88eju7sb//d//4bLLLos7R09PDy644ALcf//92L17N1paWjB79mzU1NRgw4YNWLx4MR599NEh30MoFMK1116LJUuWYNOmTZg2bRpOPPFEdHV14aGHHsKFF16I7u7uvPz3yolMFenDDz+Um5qa5DPPPFOWZVm+5JJL5KamJvmjjz5K2Pess86SZ86cKQeDQfnKK6+Um5qa5FdffVWWZVletWqV3NTUJJ988sny/v37445bt26dPG3aNLmpqUnetm1bdPuNN94oNzU1yUuXLo1uW79+vTxlyhT5qKOOktevXx93nueee05uamqSTzzxRNnj8eTtvwERkRq0tbXJTU1NclNTU9rHZHNPnT9/vtzU1CQ3NzfL//jHP6Lb//3vf0fv5VOnTpXfe++96Gs7duyQZ8yYITc1NcmbNm2Kbr/77rvlpqYm+YorrpD9fn90uyRJ8iOPPCI3NTXJxxxzTFy5Tj75ZLmpqUn+9NNPo9t+97vfyU1NTfI555wjt7W1Rbd7PB550aJFclNTk3zNNdek/d+lUFizNEyceeaZAIC33norbvv27duxbds2nHHGGdBoNAnH+Xw+nHrqqfjZz36GkSNHxr127LHHoqmpCUB46KuSpUuXQpZlLFq0CEcffXTca/Pnz8fs2bPR0dGB5cuXZ/zeiIgqhdK0ARdffHF0v1zuqaeffjqOP/746O+TJ0/GjBkzoq/Nnj07+tqECROi3Td27twZ3V5VVYUTTzwRP//5z6HT6aLbBUHARRddBADo7u5Gf39/yvfq9/vxxz/+EQBw//33o6GhIfqa0WjEHXfcgbq6OqxcuTLu2qXAPkvDxJw5c/CrX/0Kf/3rX3HzzTdHg1Hki5SqCe7000/H6aefHrctFAph165d2LRpE3p7ewFAcQRdKBTChg0bAACzZs1Kus/s2bPx97//HR9++CHOP//8zN4cEVGFUJo6YPLkyQByv6e2tLQk7F9XVwcA+PrXv57wWqSvks/ni267+uqrE/bzer348ssv8a9//Su6ze/3w2KxJC3j5s2b4XQ6MWbMGEyaNCnhdbPZjKOPPhp//etfsX79ekyYMCHpeYqBYWmYsNlsOPHEE7Fq1Sps2LABxx13HGRZxhtvvIEJEybg0EMPTXms2+3GsmXL8N5772Hnzp3Yu3cvgsEggPBTBICkfaEienp64PF4AADf+ta3FMu5Z8+eTN8aEVHFSGfqgFzvqYM7agMD9/La2tqUrw3W0dGBF198ER999BF27doFh8MBWZbj9lf62xAp2969ezFlypSM30cxMSwNI2eddRZWrVqFN998E8cddxw+/vhjtLe349prr015TGtrKy655BLs378fFosFM2bMwOzZs9HU1IQjjjgCv/rVr/DPf/5T8bqSJAEIf+HOOussxX3HjRuX+RsjIhpGcr2narW5/+l/++23sWjRIgQCAYwcORLTp0/HIYccgqlTp+Ib3/gGTjzxxCHPEQlSI0eOxLHHHqu4b7Kap2JiWBpGTj75ZJjNZqxcuRK333473nzzTQDAvHnzUh5zxx13YP/+/Zg7dy5+/etfw2AwxL0eaYZTUlNTA51Oh0AggJtuugkjRozI7Y0QEQ1jpb6nut1u3HLLLQgEAvjlL3+Jiy66KK42qaenJ63zRPrB2my2sp+Mkx28hxGTyYRvfvOb6OnpwZo1a/DXv/4Vhx9+OMaPH5/ymI8//hgAcMUVVyQEpT179uDLL78EMPCkk4xOp4u2ka9evTrpPvfddx/OO+88PPfccxm9JyKi4abU99Tt27ejr68PtbW1mD9/fkIz3fvvvx/9WakZbsaMGTCZTNi1axd27NiR8Losy1iwYAG+973vDdmCUWgMS8NMpMr2v//7v9HZ2TnkOkSR9uuVK1fGbW9ra8M111yDUCgEQLmDNwD86Ec/AgD85je/wfr16+NeW7lyJZ555hl8/vnnSTsXEhFRvFLeUyOdwbu7u/HRRx/FvbZu3Tr8+te/jv4e2yl8MJPJhAsvvBDBYBCLFi1CW1tb9LVQKIT7778f69atQ2tra8n/NrAZbpiZNWsWampq8OWXX0Kr1eKMM85Q3P/HP/4x7rrrLjz44INYuXIlGhsbceDAAXzyyScQBAETJ07Ejh07cODAAcXznHTSSbjqqqvwyCOP4Ac/+AGam5vR0NCAtrY2bNmyBUB48ssjjjgib++ViKhSlfKe2tjYiNNOOw3vvPMOfvCDH+Coo45CTU0NduzYgW3btqGmpgYjR47EgQMH4HA4FFdnuP7667F161asWbMGZ555JqZPn466ujp8/vnn2LNnD4xGIx566KGSz+LNmqVhRqfTYc6cOQDCwSnyhJDKxRdfjN/97ndoaWnBnj178I9//AM9PT04/fTT8dJLL+GGG24AAKxatWrIay9cuBDPPPMMTjnlFHR0dGD16tXo7e3FySefjGeffRaXX3557m+QiGiYKOU99f7778fPf/5zTJ48GZ999hnWr18PjUaDBQsWYPny5dEpZ/72t78pnkev1+OJJ57AnXfeienTp2Pr1q14//33odfrccEFF+D1118fsvN3MQiyUoMiERER0TDHmiUiIiIiBQxLRERERAoYloiIiIgUMCwRERERKWBYIiIiIlLAsERERESkgGGJiIiISAHDEhEREZEChiUiIiIiBQxLRERERAoYloiIiIgUMCwRERERKWBYIiIiIlLAsERERESkQFvqAhARFdK+ffvwxBNPYMOGDdi9ezdkWcaYMWMwc+ZMLFiwAA0NDQnH/O1vf8NLL72Ezz77DH19faitrcXRRx+NH/7wh/j6178e3U+WZSxYsAAffvgh7HY73nzzTdTU1MSda8mSJfjzn/+MUaNG4fXXX0ddXV2h3zIR5Zkgy7Jc6kIQERXCV199he9973vo7OyE2WyOBqOdO3fC7/fDarXiueeeQ3NzMwAgGAxiyZIlWL58OQBgxIgRGDNmDHbv3o2enh5oNBrcfPPNmD9/fvQaHR0dmDdvHnp7ezF37lzcd9990dfeeustXH/99RBFEU899RSOO+64Ir57IsoXNsMRUcV64IEH0NnZiTlz5uCDDz7A8uXLsXz5cqxevRotLS1wuVy4//77o/s/+OCDWL58Oerr67F06VKsXbsWr776KtauXYtf/OIXEAQBd911F9asWRM9pr6+HrfffjsAYPny5XjvvfcAAHv37sVtt90GALj88ssZlIhUjGGJiCrWF198AQCYN28eLBZLdLvdbsctt9yCE044AYcccggAoLOzE8888wwA4JFHHsEJJ5wQ3V+j0eDiiy/GggULIMsy/ud//ifuOmeccQbmzZsHALjtttvQ19eHxYsXw+l0oqWlBddee20B3yURFRqb4YioYv3kJz/B6tWrMXHiRNxwww04/vjjYTQak+67bNky3HTTTTjkkEPw5ptvJt1n27ZtmDt3LgBg7dq1GDFiRPQ1l8uFefPmob29HZMmTUJraytsNhtee+01jBs3Lv9vjoiKhh28iahiLVy4EOvXr8eOHTtw9dVXQ6/Xo6WlBbNmzcLs2bMxderU6L7bt28HEO6DdOGFFyY9X+yzZWtra1xYslqtuPfee3HxxRejtbUVAHDHHXcwKBFVAIYlIqpY06ZNw1/+8hc8/vjjWLlyJXp6erB+/XqsX78ev/3tb9HU1ITbbrsNRx11FPr6+gCEa4g+/vjjIc/tdDoTtk2fPh2jR4/G3r17odPpok18RKRubIYjomFBkiRs2rQJGzZswLp167B+/XoEAgGYTCasWLECTz31FJ599lnMmTMHDz30UFbX+NWvfoUXXngBoihCkiRMmzYNL730EvR6fZ7fDREVEzt4E1FFkmUZu3fvjo5cE0URhx56KH784x/jySefxPLly2G1WuHxePDOO+9g4sSJAAaa45LxeDzYsGED2traEAqF4l57//33o0Hpsccew8iRI7FlyxY8+OCDhXuTRFQUDEtEVJF6enowZ84c/PCHP8Rnn32W8PrEiRMxduxYAOFap9mzZ0Oj0aC1tTVuaoBYzzzzDC6++GKcffbZ8Hg80e1dXV24+eabAQALFizA7Nmzo9MJPPXUU/jnP/+Z53dHRMXEsEREFam2tjY6/P/mm2/Gl19+GX1NkiQ8//zz2LZtGwRBwAknnIBx48bh/PPPBwD87Gc/w7vvvhu3/8svv4yHH34YAHDRRRfBarVGX7/11ltx4MABTJw4Eddddx0A4Fvf+hbOPPNMSJKEG2+8ES6Xq9BvmYgKhH2WiKhi7d+/H//5n/+JPXv2QBRFNDQ0oKqqCnv27EF3dzcAYNGiRbj88ssBAD6fDwsXLsTq1asBAKNGjcLo0aPR3t6Orq4uAMCcOXPwwAMPQKPRAABefvll/OIXv4AoinjhhRfQ0tISvX5XVxfOOussdHZ24uyzz8a9995bzLdPRHnCsEREFa2zsxNPPvkk/vGPf6CtrQ3BYBAjRozAkUceifnz5+OII46I21+WZaxYsQLLli3Dpk2b0NfXB4vFgqlTp+K8887DvHnzIIrhSvm2tjbMmzcPbrcbl156KZYsWZJw/RUrVkRrmx544AGcccYZBX/PRJRfDEtERERECthniYiIiEgBwxIRERGRAoYlIiIiIgUMS0REREQKGJaIiIiIFDAsERERESlgWCIiIiJSwLBEREREpIBhiYiIiEgBwxIRERGRAoYlIiIiIgUMS0REREQKGJaIiIiIFPx/rNmWeSPLRLMAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Raw data\n", "axis = sns.stripplot(data=tips, y='tip', x='sex', alpha=.3)\n", "# Adds the means of each sex\n", "sns.pointplot(data=tips, y='tip', x='sex', \n", " linestyle='none', color='black', ax=axis, zorder=3)\n", "# Add the predictions\n", "sns.lineplot(x=female_one_male_zero,\n", " y=ttest_model.fittedvalues,\n", " color='black');" ] }, { "cell_type": "markdown", "id": "1976623f-3469-465c-9f93-cb57cc18e2c8", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Finally, we will consider how a one-way ANOVA works, and demonstrate how a linear model 'sees' an ANOVA.\n", "\n", "Lets compare the means of tips given on the different days (Thursday, Friday, Saturday, Sunday). The traditional approach here is the one-way ANOVA, done like so:" ] }, { "cell_type": "code", "execution_count": 23, "id": "5c137180-2512-4401-b7d6-640d58f5aa60", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Sourceddof1ddof2Fp-uncn2
0day32401.6723550.1735890.020476
\n", "
" ], "text/plain": [ " Source ddof1 ddof2 F p-unc n2\n", "0 day 3 240 1.672355 0.173589 0.020476" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# One way ANOVA\n", "pg.anova(data=tips, between=['day'], dv='tip', effsize='n2')" ] }, { "cell_type": "markdown", "id": "72f7f357-6830-473b-8125-92550eb03fa0", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Building this model as a GLM is conceptually very simple - we predict tips, from day. Lets fit this model and explore some consequences." ] }, { "cell_type": "code", "execution_count": 24, "id": "f29a1b13-ab27-4a12-a437-e2df1ab8a7a5", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
OLS Regression Results
Dep. Variable: tip R-squared: 0.020
Model: OLS Adj. R-squared: 0.008
No. Observations: 244 F-statistic: 1.672
Covariance Type: nonrobust Prob (F-statistic): 0.174
\n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "\n", " \n", "\n", "
coef std err t P>|t| [0.025 0.975]
Intercept 2.7715 0.175 15.837 0.000 2.427 3.116
day[T.Fri] -0.0367 0.361 -0.102 0.919 -0.748 0.675
day[T.Sat] 0.2217 0.229 0.968 0.334 -0.229 0.673
day[T.Sun] 0.4837 0.236 2.051 0.041 0.019 0.948


Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/latex": [ "\\begin{center}\n", "\\begin{tabular}{lclc}\n", "\\toprule\n", "\\textbf{Dep. Variable:} & tip & \\textbf{ R-squared: } & 0.020 \\\\\n", "\\textbf{Model:} & OLS & \\textbf{ Adj. R-squared: } & 0.008 \\\\\n", "\\textbf{No. Observations:} & 244 & \\textbf{ F-statistic: } & 1.672 \\\\\n", "\\textbf{Covariance Type:} & nonrobust & \\textbf{ Prob (F-statistic):} & 0.174 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n", "\\begin{tabular}{lcccccc}\n", " & \\textbf{coef} & \\textbf{std err} & \\textbf{t} & \\textbf{P$> |$t$|$} & \\textbf{[0.025} & \\textbf{0.975]} \\\\\n", "\\midrule\n", "\\textbf{Intercept} & 2.7715 & 0.175 & 15.837 & 0.000 & 2.427 & 3.116 \\\\\n", "\\textbf{day[T.Fri]} & -0.0367 & 0.361 & -0.102 & 0.919 & -0.748 & 0.675 \\\\\n", "\\textbf{day[T.Sat]} & 0.2217 & 0.229 & 0.968 & 0.334 & -0.229 & 0.673 \\\\\n", "\\textbf{day[T.Sun]} & 0.4837 & 0.236 & 2.051 & 0.041 & 0.019 & 0.948 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n", "%\\caption{OLS Regression Results}\n", "\\end{center}\n", "\n", "Notes: \\newline\n", " [1] Standard Errors assume that the covariance matrix of the errors is correctly specified." ], "text/plain": [ "\n", "\"\"\"\n", " OLS Regression Results \n", "==============================================================================\n", "Dep. Variable: tip R-squared: 0.020\n", "Model: OLS Adj. R-squared: 0.008\n", "No. Observations: 244 F-statistic: 1.672\n", "Covariance Type: nonrobust Prob (F-statistic): 0.174\n", "==============================================================================\n", " coef std err t P>|t| [0.025 0.975]\n", "------------------------------------------------------------------------------\n", "Intercept 2.7715 0.175 15.837 0.000 2.427 3.116\n", "day[T.Fri] -0.0367 0.361 -0.102 0.919 -0.748 0.675\n", "day[T.Sat] 0.2217 0.229 0.968 0.334 -0.229 0.673\n", "day[T.Sun] 0.4837 0.236 2.051 0.041 0.019 0.948\n", "==============================================================================\n", "\n", "Notes:\n", "[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.\n", "\"\"\"" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Fit the ANOVA style model\n", "anova = smf.ols('tip ~ day', data=tips).fit()\n", "anova.summary(slim=True)" ] }, { "cell_type": "markdown", "id": "c6b4e472-c2a7-4f56-b5b7-5c6388d1f50b", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "Note that the $R^2$ is the same, as is the F statistic and the p-value!\n", "\n", "The coefficients are interesting here. You can see they state Fri, Sat, and Sun. Where is Thursday? Much like in the t-test example, *Thursday is absorbed into intercept*. \n", "Each coefficient represents the difference between the intercept and that particular day. When all the coefficient are zero (i.e., not that day) then the model returns the mean of Thursdays tips. Again we will focus on our models capabilities to predict things as we continue, but in these instances it is good to know what the coefficients mean before things get too complex.\n" ] }, { "cell_type": "markdown", "id": "b505ace7-0c00-44a2-8260-228b92b724ed", "metadata": { "editable": true, "slideshow": { "slide_type": "slide" }, "tags": [] }, "source": [ "### The design matrix\n", "This is a technical aside but can be useful in gaining understanding as we move forward. Behind every model you build in `statsmodels`, there is something called the *design matrix*. The data you provide isn't always the data that the model is fitted to, but it is transformed in a way that OLS can use. For example, you can't do statistics on strings ('Thursday', 'Female', etc) - there is a transform that happens to make a numeric version of it. This is sometimes referred to as 'dummy coding', where a categorical variable will be spread into as many columns as there are levels of the variable, with a '1' representing a particular level and zero elsewhere. \n", "\n", "An example will help. Consider the following dataframe that has some simple categorical-style data." ] }, { "cell_type": "code", "execution_count": 25, "id": "93484d38-ae2a-41b0-9637-d9b3d3dae20f", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
categories
0Wales
1Wales
2England
3Scotland
4Ireland
\n", "
" ], "text/plain": [ " categories\n", "0 Wales\n", "1 Wales\n", "2 England\n", "3 Scotland\n", "4 Ireland" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Create a small categorical dataset\n", "df = pd.DataFrame({'categories': ['Wales', 'Wales', 'England', \n", " 'Scotland', 'Ireland']})\n", "display(df)" ] }, { "cell_type": "markdown", "id": "ee79dae4-c14c-4a16-ae35-768477118575", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "We could imagine this is a predictor in a regression. In its current form, it won't work. However, we can import something called `patsy`, a package that does the translating of datasets for us for our models. It has a function called the `dmatrix` which will turn this data into what a model will see, that is, the design matrix. It works in much the same way as `smf.ols` does. Lets import it and demonstrate:" ] }, { "cell_type": "code", "execution_count": 26, "id": "cb0a0518-ca67-496b-82e2-645884c8b353", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Interceptcategories[T.Ireland]categories[T.Scotland]categories[T.Wales]
01.00.00.01.0
11.00.00.01.0
21.00.00.00.0
31.00.01.00.0
41.01.00.00.0
\n", "
" ], "text/plain": [ " Intercept categories[T.Ireland] categories[T.Scotland] \\\n", "0 1.0 0.0 0.0 \n", "1 1.0 0.0 0.0 \n", "2 1.0 0.0 0.0 \n", "3 1.0 0.0 1.0 \n", "4 1.0 1.0 0.0 \n", "\n", " categories[T.Wales] \n", "0 1.0 \n", "1 1.0 \n", "2 0.0 \n", "3 0.0 \n", "4 0.0 " ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Import just the design matrix\n", "from patsy import dmatrix\n", "dmatrix('~ categories', data=df, return_type='dataframe') \n", "# notice there's no DV but the formula is the same!" ] }, { "cell_type": "markdown", "id": "bbd30423-96c2-445e-a069-b8745c2fb953", "metadata": { "editable": true, "slideshow": { "slide_type": "subslide" }, "tags": [] }, "source": [ "You can see that it has chosen England to become the intercept (this is chosen alphabetically), and each column has a '1' where the title of that column exists in the original data. This representation is what Python uses to build our models. This is not essential to know but it will deepen your understanding." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.2" } }, "nbformat": 4, "nbformat_minor": 5 }